stm32f407ret6 ucos系统开发踩坑开始
因项目需要,第一次使用stm32f4系列芯片,第一次使用ucos系统进行开发,软件踩坑行动正式开始
购买stm43f407正点原子的最小系统板
找到ucos系统程序,直接跳过移植阶段
修改下IO口,在直接的电路板上实现LED灯的闪烁
IO口配置部分,注释就不改了,keil的中文编码方式和博客的中文编码方式不一致,导致乱码,在keil下可以正常显示
IO口配置代码
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//ʹÄÜGPIOAʱÖÓ
//GPIOA6,A7³õʼ»¯ÉèÖÃ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;//LED0ºÍLED1¶ÔÓ¦IO¿Ú
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//ÆÕͨÊä³öģʽ
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ
GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯GPIO
GPIO_SetBits(GPIOA,GPIO_Pin_6 | GPIO_Pin_7);//GPIOA6,A7ÉèÖøߣ¬µÆÃð
}
ucos任务基本参数设置
//START ÈÎÎñ
//ÉèÖÃÈÎÎñÓÅÏȼ¶
#define START_TASK_PRIO 10 //¿ªÊ¼ÈÎÎñµÄÓÅÏȼ¶ÉèÖÃΪ×îµÍ
//ÉèÖÃÈÎÎñ¶ÑÕ»´óС
#define START_STK_SIZE 64
//ÈÎÎñ¶ÑÕ»
OS_STK START_TASK_STK[START_STK_SIZE];
//ÈÎÎñº¯Êý
void start_task(void *pdata);
//LED0ÈÎÎñ
//ÉèÖÃÈÎÎñÓÅÏȼ¶
#define LED0_TASK_PRIO 7
//ÉèÖÃÈÎÎñ¶ÑÕ»´óС
#define LED0_STK_SIZE 64
//ÈÎÎñ¶ÑÕ»
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
//ÈÎÎñº¯Êý
void led0_task(void *pdata);
//LED1ÈÎÎñ
//ÉèÖÃÈÎÎñÓÅÏȼ¶
#define LED1_TASK_PRIO 6
//ÉèÖÃÈÎÎñ¶ÑÕ»´óС
#define LED1_STK_SIZE 64
//ÈÎÎñ¶ÑÕ»
OS_STK LED1_TASK_STK[LED1_STK_SIZE];
//ÈÎÎñº¯Êý
void led1_task(void *pdata);
main主函数,初始化系统时钟设置
初始化LED IO口配置
ucos系统初始化
创建起始任务
ucos系统开始工作
int main(void)
{
delay_init(168); //³õʼ»¯ÑÓʱº¯Êý
LED_Init(); //³õʼ»¯LED¶Ë¿Ú
OSInit();
OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//´´½¨ÆðʼÈÎÎñ
OSStart();
}
**```
开始任务
创建led0_task任务和led1_task任务**
```c
void start_task(void *pdata)
{
OS_CPU_SR cpu_sr=0;
pdata = pdata;
OS_ENTER_CRITICAL(); //½øÈëÁÙ½çÇø(ÎÞ·¨±»Öжϴò¶Ï)
OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);
OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);
OSTaskSuspend(START_TASK_PRIO); //¹ÒÆðÆðʼÈÎÎñ.
OS_EXIT_CRITICAL(); //Í˳öÁÙ½çÇø(¿ÉÒÔ±»Öжϴò¶Ï)
}
LED0和LED1任务,灯光闪烁
//LED0ÈÎÎñ
void led0_task(void *pdata)
{
while(1)
{
LED0=0;
delay_ms(80);
LED0=1;
delay_ms(920);
};
}
//LED1ÈÎÎñ
void led1_task(void *pdata)
{
while(1)
{
LED1=0;
delay_ms(300);
LED1=1;
delay_ms(300);
};
}
实现灯光闪烁效果,移植成功,走出了第一步
因后续任务对时序要求和任务执行嵌套会比较多,因此使用ucos系统来进行开发,之前使用裸机加时间片的方式,会比较混乱,先开头,后续还有一堆问题需要解决