本帖最后由 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分别以不同的频率闪动了。一个是软定时器实现,一个是线程实现。
代码:
freertostest3.rar
(12.07 MB, 下载次数: 61)
|