你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
damiaa 提问时间:2017-4-15 19:50 /
本帖最后由 damiaa 于 2017-4-16 12:33 编辑

                                   NUCLEO-L496ZG+freertos软定时器和线程使用
终于收到NUCLEO-L496ZG,自然还是很开心的,那开始评测吧。先来张倩照:
9A727C22681EDD7AF2DF78D01834F53D.jpg
STMm32L496是STM32L4系列家族的新品!Stm32L496是目前STM32L4XX的最新版本。板子做工精致,耐看。144CPU,阔气。
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支持

开发板上电:
192847g9j9a7vok9088dka.jpg
193120hvvo9zwvavdemxx9.jpg
开发环境搭建;
1,            安装试用版MDK523或其他.
2,            安装STM32CUBEMX.
3,            下载STM32CubeL4解压(如果你想看看参考代码)
4,            FREERTOS试跑
打开STM32cUBEMx,NEW一个工程,选择板子为NELUE-STM32L496ZG
选择上FREERTOS,如下
QQ图片20170415193255.png
记得配置一下软件定时器 Config parameters中启用软件定时器。USE_TIMES ENABLE如下;
QQ图片20170415193358.png
Sys 的Time base source 选择一个定时器,这里选定时器1 ,其他也是可以的(不要SYSTICK,这个配置好像系统冲突)
QQ图片20170415193540.png
生成一个MDK项目。
QQ图片20170415193647.png
修改程序:
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);

QQ图片20170415193836.png
这样就实现了软件定时器定时点亮LED和线程定时启动LED两个功能。
编译:
运行:两个LED分别以不同的频率闪动了。一个是软定时器实现,一个是线程实现。
IMG_20170415_192845.jpg

代码: freertostest3.rar (12.07 MB, 下载次数: 62)
收藏 2 评论6 发布时间:2017-4-15 19:50

举报

6个回答
钊钊 回答时间:2017-4-16 10:38:53
很详细的例子
damiaa 回答时间:2017-4-16 12:26:37

谢谢支持
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
谢谢分享,晚上好!

谢谢支持。

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版