zoukankan      html  css  js  c++  java
  • STM32F429i-DISCO FreeRTOS keil STM32CubeMX

    目标: 

    在STM32F429 Disco开发板上用FreeRTOS双线程点亮双闪led。

    准备:

    0. STM32F429i-DISCO

    1. keil ARMMDK 5.13

    2. STM32CubeMX 4.8

    步骤:

    1. 建立工程

    keil - project - new project

    2. 保存在硬盘上, 给工程起名字

    c1

    3. 保存工程

    同时弹出了器件选择界面, 选STM32F429ZITx

    4. 上面界面点OK后出来了运行环境配置界面

    c3

    展开CMSIS:RTOS and enable :Keil RTX :

    Validation Output 区域显示了依赖组件, 点Resolve,然后OK

    现在,需求的组件被添加进了工程(startup , RTX config, CMSIS系统文件)

    5. GPIO和时钟配置。

    打开cube

    选好器件

          

    配置时钟

    然后生成代码

    我要的是时钟的初始化和gpio的初始化

    /** System Clock Configuration
    */
    void SystemClock_Config(void)
    {
    
      RCC_OscInitTypeDef RCC_OscInitStruct;
      RCC_ClkInitTypeDef RCC_ClkInitStruct;
    
      __PWR_CLK_ENABLE();
    
      __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
    
      RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
      RCC_OscInitStruct.HSEState = RCC_HSE_ON;
      RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
      RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
      RCC_OscInitStruct.PLL.PLLM = 8;
      RCC_OscInitStruct.PLL.PLLN = 336;
      RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
      RCC_OscInitStruct.PLL.PLLQ = 4;
      HAL_RCC_OscConfig(&RCC_OscInitStruct);
    
      RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1
                                  |RCC_CLOCKTYPE_PCLK2;
      RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
      RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
      RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
      RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
      HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
    
      HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
    
      HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
    
    }
    初始化168M系统时钟
    /** Configure pins as 
            * Analog 
            * Input 
            * Output
            * EVENT_OUT
            * EXTI
    */
    void MX_GPIO_Init(void)
    {
    
      GPIO_InitTypeDef GPIO_InitStruct;
    
      /* GPIO Ports Clock Enable */
      __GPIOH_CLK_ENABLE();
      __GPIOG_CLK_ENABLE();
    
      /*Configure GPIO pins : PG13 PG14 */
      GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
      HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
    
    }
    初始化GPIO

    把这两段代码加进main.c,并调用

    6. 配置FreeRtos的时钟

    打开RTX_Conf_CM.c文件, 文件下面有个configuration标签, 在这里配置168M时钟和上面匹配

    c6

    8. 添加main函数

    右键Source group 1, 选Add New Item to Group

    c7

    Select User Code Template and click on  “CMSIS-RTOS ‘main’ function”. Click Add.

    c8

    9. Edit the main program code. First add the CMSIS-RTOS RTX header. Right-click on a blank line at the beginning of the file main.c and from popup menu select Insert ‘#include files’. Include the header file cmsis_os.h.

    10. Hal驱动

    11. 写应用代码

    添加LED.h, LED.H

    /*------------------------------------------------------------------------ 
     * File LED.h 
     *----------------------------------------------------------------------*/ 
    void Init_BlinkyThread ( void ); // Initialize thread
    /*------------------------------------------------------------------------ 
     * File LED.c 
     *----------------------------------------------------------------------*/ 
    #include "stm32f4xx.h" // Device header 
    #include "cmsis_os.h" // RTOS:Keil RTX header 
    #include "LED.h"
    #include "stm32f4xx_hal.h"
     
    // Prototype function 
    void LEDG_blink(void const *argument);
    void LEDR_blink(void const *argument);
    
    
    // Define blinky thread 
    osThreadDef (LEDG_blink, osPriorityNormal, 1, 0); 
    osThreadDef (LEDR_blink, osPriorityNormal, 1, 0); 
    
    
    void LEDG_blink(void const *argument) {
        for (;;) { 
            HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET);
            osDelay (500); // Delay 500 ms 
            HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET);
            osDelay (500); // Delay 500 ms 
        }
    }
    void LEDR_blink(void const *argument) {
        for (;;) { 
            HAL_GPIO_WritePin(GPIOG, GPIO_PIN_14, GPIO_PIN_SET);
            osDelay (300); // Delay 500 ms 
            HAL_GPIO_WritePin(GPIOG, GPIO_PIN_14, GPIO_PIN_RESET);
            osDelay (300); // Delay 500 ms 
        }
    }
     
    void Init_BlinkyThread (void) { 
        osThreadCreate (osThread(LEDR_blink), NULL); // Create thread 
        osThreadCreate (osThread(LEDG_blink), NULL); // Create thread 
    }
    LED.c

    12. 在main.c里面调用

    /*
     * main: initialize and start the system
     */
    int main (void) {
        SystemClock_Config();
        MX_GPIO_Init();
        osKernelInitialize (); // Initialize CMSIS-RTOS 
        
        // create 'thread' functions that start executing, 
        // example: tid_name = osThreadCreate (osThread(name), NULL); 
        Init_BlinkyThread (); // Start Blinky thread 
        //osThreadCreate (osThread(blink_LED), NULL); // Create thread 
        osKernelStart (); // Start thread execution 
        
        while (1); 
    }
  • 相关阅读:
    Spring Batch 之 Sample(XML文件操作)(五)
    Spring Batch 之 Spring Batch 简介(一)
    Spring Batch 之 Sample(固定长格式文件读写)(六)
    Spring Batch 之 Sample(复合格式文件的读、多文件的写)(七)
    bat调用jar包的两个典型问题
    Spring Batch 之 Sample(Hello World)(三)
    开园大吉
    js中createElement方法的兼容性
    Struts2中关于"There is no Action mapped for namespace / and action name"的总结
    Spring Batch 之 框架流程简单介绍(二)
  • 原文地址:https://www.cnblogs.com/zhaitao85/p/4641238.html
Copyright © 2011-2022 走看看