新的项目用stm32开发,用到5个串口,串口1,2,3调的都蛮顺利的,调的串口4,5,程序就挂了,去网上也找了很多资料,有说启动文件没有
DCD UART4_IRQHandler ; UART4
DCD UART5_IRQHandler
,有说把sdio开启了,但是,我这个启动文件有对串口4,5的中断声明,也没把sdio开启,弄了两天,头昏眼花,想起原子论坛,赶紧到这里求助!
(参考原子程序,其他源程序已经省略,用在485通信)
void NVIC_Configuration(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
}
void uart4_init(u32 bound)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4 , ENABLE); //使能USART4,GPIOA,GPIOC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);
USART_DeInit(UART4); //复位串口4
//USART4_EN PA.15
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //PA.15
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA15
USART4_EN=0; //接收状态
//USART4_TX PC.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PC.10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化PC10
//USART4_RX PC.11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化Pc11
//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(UART4, &USART_InitStructure); //初始化串口
#if EN_USART4_RX //如果使能了接收
//Usart4 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = UART4_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_ITConfig(UART4, USART_IT_RXNE, ENABLE);//开启中断
#endif
USART_Cmd(UART4, ENABLE); //使能串口
}
int main(void)
{
u16 t;
u16 len;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE); //开启重映射功能 能用PA15作输出口
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //关闭jtag,保留swd
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart4_init(9600); //串口4初始化为9600
while(1)
{
USART4_EN=1;
for(t=0;t<10;t++)
{
while(USART_GetFlagStatus(UART4,USART_FLAG_TXE)!=SET);//等待发送结束
USART_SendData(UART4, 0xaa);//向串口1发送数据 由于接收,发送数据一致,所以直接用接收缓冲器
}
}
}
当不加USART4_EN=1;示波器看TX有输出波形,当加上这句,程序就跳到启动文件
CAN2_SCE_IRQHandler
OTG_FS_IRQHandler
B .
ENDP
B.这个位置。
当加上USART4_EN=0;看接收信号,当有信号接收,程序也跳到B.这个位置。
关闭重映射,用其他脚使能485,同样存在这些问题。
到底是哪里问题,麻烦各位大侠指点一二...
|