当前位置:   article > 正文

AT32F403A-RTOS 建立过程 [keil5.38a&rtthread3.1.5]_at32f403 keil

at32f403 keil

准备:

1.Keil5_AT32MCU_AddOn_V2.2.7.zip

https://www.arterytek.com/file/download/1691

2.RealThread.RT-Thread.3.1.5.pack

https://www.rt-thread.org/download/mdk/RealThread.RT-Thread.3.1.5.pack

开始建立工程:

1.新建AT32工程

2.在Manage Run-time Environment中选择以下内容

3.Options(仅列出需要注意的选项)

4.注释掉 at32f403a_407_int.c中HardFault_Handler、PendSV_Handler、SysTick_Handler

5.配置rtthread

6.配置board.c中#error "TODO 1: OS Tick Configuration."

  1. /****************************************************************************
  2.  *  名  称:void SysTick_Handler(void)
  3.  *  描  述:Systick中断服务程序,这个函数必须要更新rtthread系统节拍
  4.  *  参  数:
  5.  *  调  用:
  6.  ****************************************************************************/
  7. void SysTick_Handler(void)
  8. {
  9.     rt_os_tick_callback();
  10. }
  11. void rt_hw_board_init(void)
  12. {
  13. //#error "TODO 1: OS Tick Configuration."
  14.     /* 
  15.      * TODO 1: OS Tick Configuration
  16.      * Enable the hardware timer and call the rt_os_tick_callback function
  17.      * periodically with the frequency RT_TICK_PER_SECOND. 
  18.      */
  19.     /* Call components board initial (use INIT_BOARD_EXPORT()) */
  20.     /****************************************************************************/
  21.     //设定系统时钟
  22.     nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  23.     system_clock_config();
  24.     //设定systick
  25.     systick_clock_source_config(SYSTICK_CLOCK_SOURCE_AHBCLK_NODIV); 
  26.     SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);
  27. /****************************************************************************/
  28. #ifdef RT_USING_COMPONENTS_INIT
  29.     rt_components_board_init();
  30. #endif
  31. #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
  32.     rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
  33. #endif
  34. }

7.配置board.c中#error "TODO 2: Enable the hardware uart and config baudrate."和#error "TODO 3: Output the string 'str' through the uart."

  1. static int uart_init(void)
  2. {
  3. //#error "TODO 2: Enable the hardware uart and config baudrate."
  4. /****************************************************************************/
  5.        debug_uart_init(115200);
  6. /****************************************************************************/
  7.     return 0;
  8. }
  9. INIT_BOARD_EXPORT(uart_init);
  10. void rt_hw_console_output(const char *str)
  11. {
  12. //#error "TODO 3: Output the string 'str' through the uart."
  13. /****************************************************************************/
  14.     rt_enter_critical();
  15.     /* 直到字符串结束 */
  16.     while (*str != '\0')
  17.         {
  18.             /* 换行 */
  19.             if (*str == '\n')
  20.                 {
  21.                     // 发送
  22.                     usart_data_transmit(USART1, '\r');
  23.                     // 发送完成标志
  24.                     while (usart_flag_get(USART1, USART_TDC_FLAG) == RESET);
  25.                 }
  26.             usart_data_transmit(USART1,  *str++);
  27.             // 发送完成标志
  28.             while (usart_flag_get(USART1, USART_TDC_FLAG) == RESET) ;
  29.         }
  30.     /* 退出临界段 */
  31.     rt_exit_critical();
  32. /****************************************************************************/
  33. }

8.配置finsh_port.c中#error "TODO 4: Read a char from the uart and assign it to 'ch'."

  1. RT_WEAK char rt_hw_console_getchar(void)
  2. {
  3.     /* Note: the initial value of ch must < 0 */
  4.     int ch = -1;
  5. //#error "TODO 4: Read a char from the uart and assign it to 'ch'."
  6.     /****************************************************************************/
  7.         if (usart_flag_get(USART1, USART_RDBF_FLAG) != RESET)
  8.     {
  9.         ch = USART1->dt & 0xff;
  10.     }
  11.     else
  12.     {
  13.         if(usart_flag_get(USART1, USART_ROERR_FLAG) != RESET)
  14.         {
  15.             /* clear overrun flag */
  16.             USART1->sts;
  17.             USART1->dt;
  18.         }
  19.         rt_thread_mdelay(1);
  20.     }
  21. /****************************************************************************/   
  22.     return ch;
  23. }

9.main.c内容如下

  1. #include <rtthread.h>
  2. #include <project_config.h>
  3. #define DBG_TAG "main"
  4. #define DBG_LVL DBG_LOG
  5. #include <rtdbg.h>
  6. ALIGN(RT_ALIGN_SIZE) //RT_ALIGN_SIZE此处为4,要求给下面的数组分配地址时满足4字节对齐
  7. /* 定义线程栈 */
  8. static struct rt_thread thread1;
  9. rt_uint8_t thread1_stack[1024];
  10. static struct rt_thread thread2;
  11. rt_uint8_t thread2_stack[1024];
  12. /****************************************************************************
  13. * 名 称:void thread1_entry(void *p_arg)
  14. * 描 述:
  15. * 参 数:
  16. * 调 用:
  17. ****************************************************************************/
  18. /* 线程 1 */
  19. void thread1_entry(void *p_arg) // (1)
  20. {
  21. while (1)
  22. {
  23. delay_ms(100);
  24. }
  25. }
  26. /****************************************************************************
  27. * 名 称:void thread2_entry(void *p_arg)
  28. * 描 述:
  29. * 参 数:
  30. * 调 用:
  31. ****************************************************************************/
  32. /* 线程 2 */
  33. void thread2_entry(void *p_arg) // (2)
  34. {
  35. while (1)
  36. {
  37. delay_ms(500);
  38. POUT1_1;
  39. delay_ms(500);
  40. POUT1_0;
  41. }
  42. }
  43. /****************************************************************************
  44. * 名 称:void thread_init(void)
  45. * 描 述:线程初始化
  46. * 参 数:
  47. * 调 用:
  48. ****************************************************************************/
  49. void thread_init(void)
  50. {
  51. LOG_I("**************************************************");
  52. /* 初始化线程1,名称是thread1,入口是thread1_entry */
  53. if (rt_thread_init(&thread1, "thread1", thread1_entry, RT_NULL,
  54. &thread1_stack[0], sizeof(thread1_stack), 1, 10) == RT_EOK)
  55. {
  56. LOG_I("'thread1' thread startup...");
  57. rt_thread_startup(&thread1);
  58. }
  59. else
  60. {
  61. LOG_E("'thread1' Creation failure!");
  62. }
  63. /* 初始化线程2,名称是thread2,入口是thread2_entry */
  64. if (rt_thread_init(&thread2, "thread2", thread2_entry, RT_NULL,
  65. &thread2_stack[0], sizeof(thread2_stack), 2, 10) == RT_EOK)
  66. {
  67. LOG_I("'thread2' thread startup...");
  68. rt_thread_startup(&thread2);
  69. }
  70. else
  71. {
  72. LOG_E("'thread2' Creation failure!");
  73. }
  74. LOG_I("**************************************************");
  75. }
  76. /****************************************************************************
  77. * 名 称:
  78. * 描 述:
  79. * 参 数:
  80. * 调 用:
  81. ****************************************************************************/
  82. int main()
  83. {
  84. //keil rtthread main函数 不能用delay,否则main线程会卡死 。只适合初始化开机条件
  85. //问题修复方法,启用 RT_USING_HEAP
  86. user_board_init();
  87. thread_init();
  88. while(1)
  89. {
  90. delay_ms(500);
  91. POUT2_1;
  92. delay_ms(500);
  93. POUT2_0;
  94. }
  95. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/67512
推荐阅读
  

闽ICP备14008679号