高级会员
- 积分
- 717
- 金钱
- 717
- 注册时间
- 2016-6-10
- 在线时间
- 191 小时
|
1金钱
小弟最近在学习ucos,在做实验时对于main()函数里的初始化外设有点奇怪,不需要用到的初始化我都去掉了,然后问题来了
以下是源码
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "includes.h"
#include "LCD.h"
//UCOSIII中以下优先级用户程序不能使用,ALIENTEK
//将这些优先级分配给了UCOSIII的5个系统内部任务
//优先级0:中断服务服务管理任务 OS_IntQTask()
//优先级1:时钟节拍任务 OS_TickTask()
//优先级2:定时任务 OS_TmrTask()
//优先级OS_CFG_PRIO_MAX-2:统计任务 OS_StatTask()
//优先级OS_CFG_PRIO_MAX-1:空闲任务 OS_IdleTask()
//任务优先级
#define START_TASK_PRIO 3
//任务堆栈大小(字节)
#define START_STK_SIZE 128
//任务控制块
OS_TCB StartTaskTCB;
//任务堆栈
CPU_STK START_TASK_STK[START_STK_SIZE];
//任务函数声明
void start_task(void *p_arg);
//任务1
#define TASK1_TASK_PRIO 4
#define TASK1_STK_SIZE 128
OS_TCB TASK1TaskTCB;
CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE];
void task1_task(void *p_arg);
unsigned int color[]={0xFFFF,0x0000,0xFFE0};//定义颜色
char i=0;
int main(void)
{
OS_ERR err;
CPU_SR_ALLOC();
delay_init(); //时钟初始化
uart_init(115200); //串口初始化
LCD_Init(); //LCD初始化
OSInit(&err);//ucos初始化
//进入临界区
OS_CRITICAL_ENTER();
//创建第一个任务
OSTaskCreate( (OS_TCB * )&StartTaskTCB, //任务控制块
(CPU_CHAR * )"start task", //任务名字(字符串)
(OS_TASK_PTR )start_task, //任务函数
(void * )0, //传递给任务函数的参数
(OS_PRIO )START_TASK_PRIO, //任务优先级
(CPU_STK * )&START_TASK_STK[0],//任务堆栈基地址
(CPU_STK_SIZE)START_STK_SIZE/10, //任务堆栈深度限位
(CPU_STK_SIZE)START_STK_SIZE, //任务堆栈大小
(OS_MSG_QTY )0, //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
(OS_TICK )0, //当使能时间片轮转时的时间片长度,为0时为默认长度,
(void * )0, //用户补充的存储区
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项
(OS_ERR * )&err); //存放该函数错误时的返回值
//退出临界区
OS_CRITICAL_EXIT();
OSStart(&err);//启动操作系统
}
//起始任务(创建其他任务)
void start_task(void *p_arg)
{
OS_ERR err;//错误类型报告
CPU_SR_ALLOC();
p_arg = p_arg;
OS_CRITICAL_ENTER();
//创建第二个任务
OSTaskCreate( (OS_TCB * )&TASK1TaskTCB, //任务控制块
(CPU_CHAR * )"task1 task", //任务名字(字符串)
(OS_TASK_PTR )task1_task, //任务函数
(void * )0, //传递给任务函数的参数
(OS_PRIO )TASK1_TASK_PRIO, //任务优先级
(CPU_STK * )&TASK1_TASK_STK[0],//任务堆栈基地址
(CPU_STK_SIZE)TASK1_STK_SIZE/10, //任务堆栈深度限位
(CPU_STK_SIZE)TASK1_STK_SIZE, //任务堆栈大小
(OS_MSG_QTY )0, //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
(OS_TICK )0, //当使能时间片轮转时的时间片长度,为0时为默认长度,
(void * )0, //用户补充的存储区
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项
(OS_ERR * )&err); //存放该函数错误报告
OS_CRITICAL_EXIT();
OSTaskDel((OS_TCB*)&StartTaskTCB,&err); //删除start_task任务自身
}
//task1_task任务,使显示屏每一秒刷一次屏
void task1_task(void *p_arg)
{
OS_ERR err;//错误类型报告
while(1)
{
LCD_Clear(color[i]);//清屏,并加入相应的颜色
if(i==3)i=0;
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
i++;
}
}
其中把串口初始化这句话去掉之后,再下载会发现,程序只能运行一次,在硬件复位之后,程序就卡死了,查看串口初始化里的内容
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, ENABLE); //使能USART1,GPIOA时钟
USART_DeInit(USART1); //复位串口1
//USART1_TX PA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9
//USART1_RX PA.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA10
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//USART 初始化设置
USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
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); //使能串口
}
仅仅初始化了2个IO,配置了串口中断,而我在后面的程序中并没有使用串口,为什么会使程序卡死呢,有没有大神可以解释一下。。。
谢谢了
|
|