damiaa 发表于 2017-4-15 19:50:58

【NUCLEO-L496ZG评测】+freertos软定时器和线程使用

本帖最后由 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分别以不同的频率闪动了。一个是软定时器实现,一个是线程实现。
代码:


钊钊 发表于 2017-4-16 10:38:53

很详细的例子

damiaa 发表于 2017-4-16 12:26:37

钊钊 发表于 2017-4-16 10:38
很详细的例子

谢谢支持

asmhai 发表于 2017-4-17 22:39:20


谢谢分享,晚上好!

any012 发表于 2017-4-18 16:58:38

工程里有这么个函数:
void StartDefaultTask(void const * argument)
但没看到创建响应任务啊。

damiaa 发表于 2017-4-20 16:10:36

any012 发表于 2017-4-18 16:58
工程里有这么个函数:
void StartDefaultTask(void const * argument)
但没看到创建响应任务啊。 ...
那个应该是没用到。你拿源代码跑跑看。

damiaa 发表于 2017-4-20 16:11:18

asmhai 发表于 2017-4-17 22:39
谢谢分享,晚上好!

谢谢支持。
页: [1]
查看完整版本: 【NUCLEO-L496ZG评测】+freertos软定时器和线程使用