完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
1、 FreeRTOS时钟节拍采用SYSTICK,所以需要将SYSTICK功能初始化,详情请参考正点原子移植的STM32F103历程。 2、 SYSTICK例程 u32 reload; SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择外部时钟 HCLK reload=SystemCoreClock/1000000; //每秒钟的计数次数 单位为M reload*=1000000/configTICK_RATE_HZ; //根据configTICK_RATE_HZ设定溢出时间 SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //开启SYSTICK中断 SysTick->LOAD = reload; //每1/configTICK_RATE_HZ秒中断一次 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK //reload为24位寄存器,最大值:16777216,在72M下,约合0.233s左右 3、 系统中断配置 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4 4、 在FreeRTOSConfig.h文件中增加如下代码: 文件末尾: #define xPortPendSVHandler PendSV_Handler #define vPortSVCHandler SVC_Handler #define INCLUDE_xTaskGetSchedulerState 1 5、 由于FreeRTOS已经编写好了SysTick_Handler函数名字xPortSysTickHandler,所以我们需要在外部文件实现SysTick_Handler接口,则需要增加如下代码。 extern void xPortSysTickHandler(void); //systick中断服务函数,使用ucos时用到 void SysTick_Handler(void) { if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行 { xPortSysTickHandler(); } } 互斥信号 1、 创建互斥锁。xSemaphoreCreateMutex() 2、 获得互斥锁。xQueueSemaphoreTake() 3、 释放互斥锁。xSemaphoreGive() 4、 要实现任务之前互斥,必须要在任务里增加vTaskDelay(500),不要就不能实现任务互斥执行。 5、 例程如下: //任务句柄 TaskHandle_t StartTask_Handler; SemaphoreHandle_t xSemaphore; static void LED1_Task(void *pvParameters) { while(1) { if(xQueueSemaphoreTake(xSemaphore,portMAX_DELAY ) == pdTRUE) { GPIO_ResetBits(GPIOC,GPIO_Pin_0); vTaskDelay(1000); GPIO_SetBits(GPIOC,GPIO_Pin_0); vTaskDelay(1000); xSemaphoreGive(xSemaphore); vTaskDelay(500); //延时500ms,也就是500个时钟节拍 } } } static void LED2_Task(void *pvParameters) { while(1) { if(xQueueSemaphoreTake(xSemaphore,portMAX_DELAY ) == pdTRUE) { GPIO_ResetBits(GPIOC,GPIO_Pin_1); vTaskDelay(1000); GPIO_SetBits(GPIOC,GPIO_Pin_1); vTaskDelay(1000); xSemaphoreGive(xSemaphore); vTaskDelay(500); //延时500ms,也就是500个时钟节拍 } } } int main(void) { u32 reload; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择外部时钟 HCLK reload=SystemCoreClock/1000000; //每秒钟的计数次数 单位为M reload*=1000000/configTICK_RATE_HZ; //根据configTICK_RATE_HZ设定溢出时间 SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //开启SYSTICK中断 SysTick->LOAD = reload; //每1/configTICK_RATE_HZ秒中断一次 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK //reload为24位寄存器,最大值:16777216,在72M下,约合0.233s左右 LED_Init(); // LED 初始化 xSemaphore = xSemaphoreCreateMutex(); //创建互斥锁 if(xSemaphore != NULL) { xTaskCreate( (TaskFunction_t) LED1_Task, (const char *) "LED1_Task", (uint16_t)128, (void *) NULL, (UBaseType_t) 5, (TaskHandle_t* )&StartTask_Handler); xTaskCreate( (TaskFunction_t) LED2_Task, (const char *) "LED2_Task", (uint16_t)128, (void *) NULL, (UBaseType_t) 3, (TaskHandle_t* )&StartTask_Handler); vTaskStartScheduler(); } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1364 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1359 浏览 1 评论
780 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
562 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1394 浏览 2 评论
1758浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
484浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
420浏览 3评论
414浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
389浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-29 05:40 , Processed in 0.820351 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号