1:任务目标
创建LED闪烁任务、按键KEY任务
工作原理:
通过按键触发中断,改变LED_State
通过KEY任务的不断轮训LED_State来挂起或者恢复任务
2:配置CubeMX
选择芯片型号开始配置
------------- System Core:------------
配置GPIO
一个为低速LED推挽输出,一个为EXTI外部中断(上升沿和下降沿都触发,初始不上拉不下拉)
配置NVIC
勾选 EXTI line interrupt
配置RCC
使能外部晶振Crystal/Ceramic
配置系统时钟源SYS
选择Timebase Source 为TIM1(防止操作系统和SYS使用同一个时钟)
-------------Connectivity--------------
配置串口
模式为异步通信Asynchronous
-------------Middleware------------------
选择 Task and Queues:
{ Add一个LED新任务,Name为LED,Entry Function 为Led_Task
优先级低,堆栈空间128,内存分配为动态,
代码生成选项为默认,参数为空NULL }
{ Add一个USART任务,优先级低 osPriorityLow ,其余同上 }
{ Add一个Key任务,优先级稍微高一些,因为它要实时响应用户的操作 }
选择include parameters
{ vTaskDelayUntil 选择Enable }
------------配置时钟Clock configuration----------------
选择外部高速时钟 HSE
------------Project Manager-------------------------
工具链Toolchain选择MDK-ARM,version V5
保存文件项目
3:生成代码Generate Code
先编译检查项目
打开main.c 重定向printf
打开main.h 新建enum Key类型
typedef enum Key {
Key_Down = 0,
Key_Up,
Key_Reset,
}enum_Key_State;
打开freertos.c
TickType_t Task_delay_count;
enum_Key_State Key_State = Key_Up;
TickType_t Delay_ticks = 1000;
void Led_Task(void const * argument)
{
for(;;)
{
Task_delay_count = xTaskGetTickCount();
HAL_GPIO_WritePin( GPIOF, GPIO_PIN_7, GPIO_PIN_RESET);
vTaskDelayUntil( &Task_delay_count,Delay_ticks );
HAL_GPIO_WritePin( GPIOF, GPIO_PIN_7, GPIO_PIN_SET);
vTaskDelayUntil( &Task_delay_count,Delay_ticks );
}
}
void Usart_Task(void const * argument)
{
for(;;)
{
printf("Ts_dly_cnt:%d\n",Task_delay_count);
osDelay(1000);
}
}
`
void Key_Task(void const * argument)
{
for(;;)
{
if(Key_State == Key_Down ){
vTaskDelay( 10);
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET){
vTaskSuspend( LEDHandle );
Key_State = Key_Down;
}
else{
Key_State = Key_Reset;
}
}
else if(Key_State == Key_Reset){
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET){
if(Key_State == Key_Reset){
vTaskResume( LEDHandle );
Key_State = Key_Up;
}
}
}
osDelay(10);
}
}
打开gpio.c
extern enum_Key_State Key_State;
void HAL_GPIO_EXTI_Callback( uint16_t GPIO_Pin){
if(GPIO_Pin == GPIO_PIN_0){
Key_State = Key_Down;
printf("EXTI\n");
}
}
printf重定向
int fputc(int ch ,FILE *p){
while( !(USART1->SR & (1<<7)));
USART1->DR = ch;
return ch;
}
|