[AT32F423] 【AT-START-F423测评】基于AT32 Work Bench工具的Freertos点灯测试

[复制链接]
1912|0
 楼主| zhouminjie 发表于 2023-11-5 22:12 | 显示全部楼层 |阅读模式
下载WIN版本AT32 Work Bench压缩包,解压后直接双击AT32_Work_Bench.exe打开工具
系列选择AT32F423,MCU型号选择AT32F423VCT7,点击新建
7200765479de846547.png
配置PD13、PD14、PD15为输出模式,初始化输出高电平
9149865479e04495ff.png
配置PF0、PF1为外部晶振引脚
9639165479e218ebe7.png
配置调试接口SWD模式
1179665479e3d7306a.png

配置NVIC为抢占优先级4位,子优先级0位;开启systick中断
5518565479e569bd6f.png
配置时钟
2317265479e6b37516.png
代码预览,根据图形化配置后会生成的初始化代码
7821265479e821b43a.png
点击生成代码
2680065479e967fb9c.png
设置项目名、项目位置、工具链、固件包位置,点击确定,生成工程
7902765479eb4a03b5.png
生成的工程文件夹中已经包含freertos文件夹
4356465479ed21b51f.png
也可从freertos官网https://www.freertos.org/zh-cn-cmn-s/下载最新源码
2658265479eff373b7.png
将freertos文件添加到工程中,其中port.c文件在portable->rvds->ARM_CM4F文件夹中,heap_4.c文件在portable-> memmang文件夹中,
3616165479f2258f54.png
添加freertos的.h头文件
7003265479f41307b7.png
打开官网的FreeRTOS源码Demo文件夹,把M4F内核的芯片例程中的FreeRTOSConfig.h文件拷贝到工程的FreeRTOS文件夹下的include文件夹中
6177265479f5da0047.png
注释禁用at32f423_int.c中的PendSV_Handler()、SysTick_Handler()、SVC_Handler(),使用freertos port.c中的xPortPendSVHandler()、xPortSysTickHandler()、vPortSVCHandler()
修改FreeRTOSConfig.h配置,configUSE_IDLE_HOOK、configUSE_TICK_HOOK、configCHECK_FOR_STACK_OVERFLOW、configUSE_MALLOC_FAILED_HOOK改为0,configTOTAL_HEAP_SIZE改为20k
382936547a0221d29c.png
测试代码设计4个任务:start_task、LEDR_task、LEDY_task、LEDG_task,start_task用来创建LEDR_task、LEDY_task、LEDG_task 3个任务,LEDR_task控制LEDR 2秒闪烁1次,LEDY_task控制LEDY 1秒闪烁1次,LEDG_task控制LEDG 0.5秒闪烁1次,编译下载测试

部分代码
  1. /* Includes ------------------------------------------------------------------*/
  2. #include "at32f423_wk_config.h"

  3. /* private includes ----------------------------------------------------------*/
  4. /* add user code begin private includes */
  5. #include "stdio.h"
  6. #include "FreeRTOS.h"
  7. #include "task.h"

  8. /* add user code end private includes */

  9. /* private typedef -----------------------------------------------------------*/
  10. /* add user code begin private typedef */

  11. /* add user code end private typedef */

  12. /* private define ------------------------------------------------------------*/
  13. /* add user code begin private define */
  14. #define START_TASK_PRIO         1
  15. #define START_STK_SIZE          128

  16. #define LEDR_TASK_PRIO      2
  17. #define LEDR_TASK_STK_SIZE  128

  18. #define LEDY_TASK_PRIO      2
  19. #define LEDY_TASK_STK_SIZE  128

  20. #define LEDG_TASK_PRIO      2
  21. #define LEDG_TASK_STK_SIZE  128

  22. /* add user code end private define */

  23. /* private macro -------------------------------------------------------------*/
  24. /* add user code begin private macro */

  25. /* add user code end private macro */

  26. /* private variables ---------------------------------------------------------*/
  27. /* add user code begin private variables */
  28. static TaskHandle_t   StartTask_Handler = NULL;
  29. static TaskHandle_t   LEDRTask_Handler = NULL;
  30. static TaskHandle_t   LEDYTask_Handler = NULL;
  31. static TaskHandle_t   LEDGTask_Handler = NULL;

  32. /* add user code end private variables */

  33. /* private function prototypes --------------------------------------------*/
  34. /* add user code begin function prototypes */
  35. void LEDR_task(void *pvParameters);
  36. void LEDY_task(void *pvParameters);
  37. void LEDG_task(void *pvParameters);

  38. /* add user code end function prototypes */

  39. /* private user code ---------------------------------------------------------*/
  40. /* add user code begin 0 */
  41. static void start_task(void *pvParameters)
  42. {
  43.     taskENTER_CRITICAL();

  44.     xTaskCreate((TaskFunction_t )LEDR_task,
  45.                 (const char*    )"LEDR_task",
  46.                 (uint16_t       )LEDR_TASK_STK_SIZE,
  47.                 (void*          )NULL,
  48.                 (UBaseType_t    )LEDR_TASK_PRIO,
  49.                 (TaskHandle_t*  )&LEDRTask_Handler);

  50.     xTaskCreate((TaskFunction_t )LEDY_task,
  51.                 (const char*    )"LEDY_task",
  52.                 (uint16_t       )LEDY_TASK_STK_SIZE,
  53.                 (void*          )NULL,
  54.                 (UBaseType_t    )LEDY_TASK_PRIO,
  55.                 (TaskHandle_t*  )&LEDYTask_Handler);

  56.     xTaskCreate((TaskFunction_t )LEDG_task,
  57.                 (const char*    )"LEDG_task",
  58.                 (uint16_t       )LEDG_TASK_STK_SIZE,
  59.                 (void*          )NULL,
  60.                 (UBaseType_t    )LEDG_TASK_PRIO,
  61.                 (TaskHandle_t*  )&LEDGTask_Handler);

  62.     vTaskDelete(StartTask_Handler);

  63.     taskEXIT_CRITICAL();
  64. }

  65. void LEDR_task(void *pvParameters)
  66. {
  67.     while (1)
  68.     {
  69.         //printf("LEDR_task run ...\r\n");
  70.         gpio_bits_toggle(GPIOD, LED_R_PIN);
  71.         vTaskDelay(2000);
  72.     }
  73. }

  74. void LEDY_task(void *pvParameters)
  75. {
  76.     while (1)
  77.     {
  78.         //printf("LEDY_task run ...\r\n");
  79.         gpio_bits_toggle(GPIOD, LED_Y_PIN);
  80.         vTaskDelay(1000);
  81.     }
  82. }

  83. void LEDG_task(void *pvParameters)
  84. {
  85.     while (1)
  86.     {
  87.         //printf("LEDG_task run ...\r\n");
  88.         gpio_bits_toggle(GPIOD, LED_G_PIN);
  89.         vTaskDelay(500);
  90.     }
  91. }


  92. /* add user code end 0 */


  93. /**
  94.   * [url=home.php?mod=space&uid=247401]@brief[/url]  take some delay for waiting power stable, delay is about 60ms with frequency 8MHz.
  95.   * @param  none
  96.   * @retval none
  97.   */
  98. static void wk_wait_for_power_stable(void)
  99. {
  100.     volatile uint32_t delay = 0;

  101.     for(delay = 0; delay < 50000; delay++);
  102. }

  103. /**
  104.   * @brief main function.
  105.   * @param  none
  106.   * @retval none
  107.   */
  108. int main(void)
  109. {
  110.     /* add user code begin 1 */

  111.     /* add user code end 1 */

  112.     /* add a necessary delay to ensure that Vdd is higher than the operating
  113.        voltage of battery powered domain (2.57V) when the battery powered
  114.        domain is powered on for the first time and being operated. */
  115.     wk_wait_for_power_stable();

  116.     /* system clock config. */
  117.     wk_system_clock_config();

  118.     /* config periph clock. */
  119.     wk_periph_clock_config();

  120.     /* system tick config */
  121.     SysTick_Config(system_core_clock / 1000);

  122.     /* nvic config. */
  123.     wk_nvic_config();

  124.     /* init gpio function. */
  125.     wk_gpio_config();

  126.     /* add user code begin 2 */
  127.     xTaskCreate((TaskFunction_t )start_task,
  128.                 (const char*    )"start_task",
  129.                 (uint16_t       )START_STK_SIZE,
  130.                 (void*          )NULL,
  131.                 (UBaseType_t    )START_TASK_PRIO,
  132.                 (TaskHandle_t*  )&StartTask_Handler);

  133.     vTaskStartScheduler();

  134.     return 0;
  135.     /* add user code end 2 */

  136.     //while(1)
  137.     //{
  138.     /* add user code begin 3 */

  139.     /* add user code end 3 */
  140.     //}
  141. }

测试例程
AT32F423VCT7_WorkBench.zip (8.46 MB, 下载次数: 11)




您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

140

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部