本帖最后由 damiaa 于 2017-4-16 12:33 编辑 NUCLEO-L496ZG+freertos软定时器和线程使用 终于收到NUCLEO-L496ZG,自然还是很开心的,那开始评测吧。先来张倩照: STMm32L496是STM32L4系列家族的新品!Stm32L496是目前STM32L4XX的最新版本。板子做工精致,耐看。144腿CPU,阔气。 STM32L496芯片特性: ARM Cortex-M4内核,最高主频80MHz,具备FPU、ART加速技术,CoreMark测试得分为273.55(@80Mhz) 超低功耗,运行模式下功耗为37uA/MHz(SMPS模式下),停机模式(Stop mode 2)下功耗约2.57uA,待机模式下最代功耗约108nA 丰富的外设支持,主要包括RTC、SPI、I2C、UART等常规外设的支持 8X40或4X44 LCD支持 USB OTG全速支持 LPTIMER及LPUART支持 开发板基本特性: 超低功耗,运行模式下功耗为37uA/MHz(SMPS模式下),停机模式(Stop mode 2)下功耗约2.57uA,待机模式下最代功耗约108nA 丰富的外设支持,主要包括RTC、SPI、I2C、UART等常规外设的支持 8X40或4X44 LCD支持 USB OTG全速支持 LPTIMER及LPUART支持 开发板上电: 开发环境搭建; 1, 安装试用版MDK523或其他. 2, 安装STM32CUBEMX. 3, 下载STM32CubeL4解压(如果你想看看参考代码) 4, FREERTOS试跑 打开STM32cUBEMx,NEW一个工程,选择板子为NELUE-STM32L496ZG 选择上FREERTOS,如下记得配置一下软件定时器 Config parameters中启用软件定时器。USE_TIMES ENABLE如下; Sys 的Time base source 选择一个定时器,这里选定时器1 ,其他也是可以的(不要SYSTICK,这个配置好像系统冲突) 生成一个MDK项目。 修改程序: 1,main函数中加 /* start timers, add new ones, ... */ osTimerDef(LEDTimer, osTimerCallback); osTimerId osTimer = osTimerCreate(osTimer(LEDTimer), osTimerPeriodic, NULL); /* Start Timer */ osTimerStart(osTimer, 200); /* USER CODE END RTOS_TIMERS */ osThreadDef(LEDThread, ToggleLEDsThread, osPriorityNormal, 0, configMINIMAL_STACK_SIZE); osThreadCreate(osThread(LEDThread), NULL); // /* Start scheduler */ osKernelStart(); 注释掉: // /* Create the thread(s) */ // /* definition and creation of defaultTask */ // osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); // defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); // /* USER CODE BEGIN RTOS_THREADS */ // /* add threads, ... */ // // /* USER CODE END RTOS_THREADS */ // /* USER CODE BEGIN RTOS_QUEUES */ // /* add queues, ... */ // /* USER CODE END RTOS_QUEUES */ // // /* Start scheduler */ // osKernelStart(); 2,main.c中加入回调函数和线程函数: /* USER CODE BEGIN 4 */ static void osTimerCallback(void const *argument) { (void) argument; /* Toggle LED1*/ // HAL_GPIO_WritePin(GPIOB, LD2_Pin, GPIO_PIN_RESET); // HAL_GPIO_WritePin(GPIOB, LD2_Pin, GPIO_PIN_SET); GPIOB->ODR ^= LD3_Pin; } static void ToggleLEDsThread(void const *argument) { (void) argument; for (;;) { /* Toggle LED2 each 400ms */ GPIOB->ODR ^= LD2_Pin;; osDelay(400); } } /* USER CODE END 4 */ 3,main函数前面加下面头文件申明static void osTimerCallback(void const *argument); static void ToggleLEDsThread(void const *argument); 这样就实现了软件定时器定时点亮LED和线程定时启动LED两个功能。 编译: 运行:两个LED分别以不同的频率闪动了。一个是软定时器实现,一个是线程实现。 代码: |
谢谢支持
谢谢分享,晚上好!
void StartDefaultTask(void const * argument)
但没看到创建响应任务啊。
那个应该是没用到。你拿源代码跑跑看。
谢谢支持。