stm32f407ret6 ucos系统开发入门移植及IO输出配置

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系统来进行开发,之前使用裸机加时间片的方式,会比较混乱,先开头,后续还有一堆问题需要解决

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值