[STM32H5] 【NUCLEO- H563ZI 测评】2.创建工程+FreeRTOS

[复制链接]
957|3
 楼主| 穿西装的强子 发表于 2023-7-21 10:50 | 显示全部楼层 |阅读模式
本帖最后由 穿西装的强子 于 2023-7-21 11:05 编辑

习惯了用标准库,因此都是自己创建工程,虽然比STM32CubeMX创建的慢,但是比较规范,适合自己。
首先创建几个文件夹
7005564b9ebda8bbd1.png
Doc放一些文档
Library放各种库文件
Project放工程
User放自己的东西
7488464b9ec1ae9c54.png
创建好的工程格式
通过自己的需求添加文件
添加文件老费劲了,东西太多了。

7890664b9ec840bc78.png
要添加宏定义和路径及其它的语言配置,找个模板代码按照模板代码修改即可。
基本上工程创建完毕了,有经验的花点时间就弄好了,这里就不多赘述了。

主函数代码
  1. int main(void)
  2. {
  3.   /* USER CODE BEGIN 1 */

  4.   /* USER CODE END 1 */

  5.   /* MCU Configuration--------------------------------------------------------*/

  6.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  7.   HAL_Init();

  8.   /* USER CODE BEGIN Init */

  9.   /* USER CODE END Init */

  10.   /* Configure the system clock */
  11.   SystemClock_Config();

  12.   /* USER CODE BEGIN SysInit */

  13.   /* USER CODE END SysInit */

  14.   /* Initialize all configured peripherals */
  15.   MX_GPIO_Init();
  16.   MX_ETH_Init();
  17.   MX_USART3_UART_Init();
  18.   MX_TIM3_Init();
  19.   MX_ICACHE_Init();

  20.   App_TX_FreeRTOS_Init();
  21.   while (1)
  22.   {
  23.   }
  24. }
初始化了三个LED,网口接口,串口3打印使用,TIM3是自己添加的1ms中断定时器。
  1. static void MX_TIM3_Init(void)
  2. {
  3.   TIM_MasterConfigTypeDef sMasterConfig = {0};
  4.   TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
  5.   TIM_ClockConfigTypeDef        sClockSourceConfig = {0};
  6.   
  7.   
  8.   htim3.Instance = TIM3;
  9.   htim3.Init.Prescaler = 250-1;
  10.   htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  11.   htim3.Init.Period = 1000-1;
  12.   htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  13.   htim3.Init.RepetitionCounter = 0;
  14.   htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  15.   if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  16.   {
  17.     Error_Handler();
  18.   }
  19.   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  20.   if( HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
  21.   {
  22.     Error_Handler();
  23.   }
  24.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  25.   sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
  26.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  27.   if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  28.   {
  29.     Error_Handler();
  30.   }
  31.   __HAL_TIM_CLEAR_IT(&htim3,TIM_IT_UPDATE);
  32.   HAL_TIM_Base_Start_IT(&htim3);

  33. }
分频250,计数1000,得到频率1000HZ
App_TX_FreeRTOS_Init()是初始化FreeRTOS,进去看了之后是内核的初始化,也就是FreeRTOS是在内核上移植的,而不是像其它的移植方式。
  1. void LEDThread_Entry(void *argument)
  2. {
  3.         (void) argument;
  4. //        HAL_ETH_BuildRxDescriptors(ð_handle);
  5.         printf("system start\r\n");
  6. //        eth_handle.TxDescList.CurTxDesc
  7.   while(1)
  8.   {
  9. //        printf("%d\r\n",system_count);
  10. //        vTaskDelay(50);
  11.         HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
  12.         /* Delay for 500ms */
  13.         vTaskDelay(50);
  14.         HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);
  15.         vTaskDelay(50);
  16.         HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin);
  17.         vTaskDelay(50);
  18.   }
  19. }
LED任务中显示延时50为500ms,通过FreeRTOSConfig.h文件看,#define configTICK_RATE_HZ                         (1000u),按理说是1000HZ,50就是50ms。
根据他在内核上移植,观察到是基于ThreadX实时系统后的FreeRTOS,也就是说,FreeRTOS的周期是基于ThreadX的,因此需要改变ThreadX的周期即可。
在tx_initialize_low_level.S文件中,SYSTICK_CYCLES    =   ((SYSTEM_CLOCK / 100) -1),也就是说100代表的是100HZ,我们只需要将所有的100改为1000即可。
6841364b9f1257b284.png
一共有三处地方,修改后,FreeRTOS按照1KHZ周期运行
编译后烧录,正常运行,流水灯效果,传不来视频,将就看把  -_-!。
8630464b9f25d6f8b3.png
yangjiaxu 发表于 2024-1-12 16:07 | 显示全部楼层
现在用freertos的人还多不多?感觉大家都是用RTT的比较多了
Allison8859 发表于 2024-1-12 16:08 | 显示全部楼层
真的不错,其实用操作系统来说,很容易实现一些逻辑问题,比中断好用的很
Betty996 发表于 2024-1-12 16:25 | 显示全部楼层
话说楼主用过H563跑分没?效果怎么样?感觉用这芯片能做点啥产品啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

63

主题

267

帖子

3

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