这几天在调试stm32f407的discover板子潜入ucos III 开始遇到很到的困难,一看函数到挺多的,感觉很简单,但是对于刚接触的童靴们估计有点困难,理解不好
分为以下几步:
1、初始化你要使用的i/o外设,这是应用st提供的官方库函数进行初始化:
2、利用ucos中bsp_int.C文件中定义的文件进行初始化处理,这样进行初始化;(后面会附上代码)
3、找准代码的运行顺序和意义;
4、测试好你的串口是可用的;
代码如下:
#include "USART.h"
void USART1_Configuration(void) //端口初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_AHB1PeriphClockCmd(Open_USART_TX_GPIO_CLK,ENABLE);
RCC_AHB1PeriphClockCmd(Open_USART_RX_GPIO_CLK,ENABLE);
RCC_APB2PeriphClockCmd(Open_USART_CLK,ENABLE);
GPIO_PinAFConfig(Open_USART_TX_GPIO_PORT, Open_USART_TX_SOURCE, Open_USART_TX_AF);
GPIO_PinAFConfig(Open_USART_RX_GPIO_PORT, Open_USART_RX_SOURCE, Open_USART_RX_AF);
/*
* Open_USART_TX -> PA9 , Open_USART_RX -PA10
*/
GPIO_InitStructure.GPIO_Pin = Open_USART_TX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(Open_USART_TX_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = Open_USART_RX_PIN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(Open_USART_RX_GPIO_PORT, &GPIO_InitStructure);
/*
USARTx configured as follow:
- BaudRate = 115200 baud
- Word Length = 8 Bits
- One Stop Bit
- No parity
- Hardware flow control disabled (RTS and CTS signals)
- Receive and transmit
*/
USART_InitStructure.USART_BaudRate = 115200;
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);
/* Enable the Open_USART Transmit interrupt: this interrupt is generated when the
Open_USART transmit data register is empty */
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //usart1??????????
USART_Cmd(USART1, ENABLE);
}
void USART1_NVIC_Config(void)
{ //中断初始化
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable the USARTx Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = Open_USART_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void USART1_INIT(void) //中断全部初始化
{
USART1_Configuration();
USART1_NVIC_Config();
BSP_IntVectSet(BSP_INT_ID_USART1, usart1_test); //??×????¨???????? BSP_IntHandlerUSART1
BSP_IntPrioSet(BSP_INT_ID_USART1,1);
BSP_IntEn(BSP_INT_ID_USART1); //????????
}
初始化的步骤:
从
BSP_IntVectSet开始说:他是* Description : Assign ISR handler.我理解就是通过bsp中的id将你的这个中断跟你的处理函数联系起来;(处理函数
usart1_test)是你自己写的处理函数,里面一般就会清中断,想任务发送信号或者是消息。(一定要注意清中断,并且在中断中不要进行太多的运算,运算一般在任务里完成)。
BSP_IntPrioSet(BSP_INT_ID_USART1,1); 这个是将你的usart优先级进行设置。一般通讯的优先级比较高。
BSP_IntEn(BSP_INT_ID_USART1); 开中断;
还有个地方需要说明void BSP_IntHandlerUSART1 (void)
{
BSP_IntHandler(BSP_INT_ID_USART1); //???????????í?????¨?©
}
这里面你不要动,因为他包含了中央处理函数,系统会在中端到来的时候跳到这里。
BSP_IntHandler(BSP_INT_ID_USART1); //中央处理函数,他里面的isr()就是志向usart1_test的指针。
你自己使用就可以完成相应的调试。