OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3906|回复: 2

发现一个奇怪的问题,望大家帮忙,解答一下,实在是感觉莫名其妙

[复制链接]

29

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2013-8-4
在线时间
0 小时
发表于 2013-12-9 22:07:49 | 显示全部楼层 |阅读模式

 移植的ucos,建立的三个任务(红灯闪烁任务、绿灯闪烁任务、LCD显示任务),主函数如下:
int main(void)
 {
  int x=0;
 SystemInit();
 delay_init(72);       //延时函数初始化  
  led_init(); 
 SysTick_Configuration();
 uart_init(9600);
 LCD_Init();
 OSInit();
 OSTaskCreate(startup_task,(void *)0,(OS_STK*)&startup_task_stk[STARTUP_TASK_STK_SIZE-1],START_TASK_PRIO);
 OSStart();
 return 0; 
 }
当我把红色背景注释掉时,ucos不能运行,取消注释后,三个任务能正常切换。当同时注释掉LCD_Init()函数和uart_init(9600)时,并删除LCD显示任务时,红灯闪烁任务和绿灯闪烁任务则能够正常切换。也就是说要想使包含LCD显示任务在内的三个任务能正常切换,必须有uart_init(9600)这个函数。
uart_init()我注释的只剩下深绿色背景的那两句,也就是说三个任务能否正常切换和下面深绿色的有关系,但是ucos正常切换为什么和这两天语句有关系呢? 我又没有用到串口,这两条深绿色的函数起到了什么作用呢?
void uart_init(u32 bound){
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
 USART_InitTypeDef USART_InitStructure;
 NVIC_InitTypeDef NVIC_InitStructure;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
     //USART1_TX   PA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    //GPIO_Init(GPIOA, &GPIO_InitStructure);
  
    //USART1_RX   PA.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    //GPIO_Init(GPIOA, &GPIO_InitStructure); 

   //Usart1 NVIC 配置

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //

   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ通道使能
 //NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART1
 
   //USART 初始化设置
  
   USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
   USART_InitStructure.USART_WordLength = USART_WordLength_8b;
   USART_InitStructure.USART_StopBits = USART_StopBits_1;
   USART_InitStructure.USART_Parity = USART_Parity_No;
   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(USART1, &USART_InitStructure); 

    //USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断 
    USART_Cmd(USART1, ENABLE);                    //使能串口

}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2013-12-10 09:46:33 | 显示全部楼层
LCD_Init()函数中有用到printf,所以uart_init(9600)需要初始化。
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

29

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2013-8-4
在线时间
0 小时
 楼主| 发表于 2013-12-10 09:52:13 | 显示全部楼层
回复【2楼】xiaoyan:
---------------------------------
thank you very much~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-16 00:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表