新手入门
- 积分
- 11
- 金钱
- 11
- 注册时间
- 2019-7-30
- 在线时间
- 2 小时
|
2金钱
我最近做一个项目要用到多个串口,正好看了原子哥的视频,想用USART2通过定时器每隔一秒发送一个数组,但程序卡在while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);上了,同样的程序用USART1发送是可以的,不知道为啥用USART2就不行,我的用的是stm32f103RCT6,下面是主要程序
配置USART2的程序:
void my_usart2_init(u16 bound)
{
GPIO_InitTypeDef gpioInitStruct;
USART_InitTypeDef usartInitStruct;
NVIC_InitTypeDef nvicInitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
//PA2 TXD
gpioInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
gpioInitStruct.GPIO_Pin = GPIO_Pin_2;
gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpioInitStruct);
//PA3 RXD
gpioInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
gpioInitStruct.GPIO_Pin = GPIO_Pin_3;
gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpioInitStruct);
usartInitStruct.USART_BaudRate = bound;
usartInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控
usartInitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //接收和发送
usartInitStruct.USART_Parity = USART_Parity_No; //无校验
usartInitStruct.USART_StopBits = USART_StopBits_1; //1位停止位
usartInitStruct.USART_WordLength = USART_WordLength_8b; //8位数据位
USART_Init(USART2, &usartInitStruct);
USART_Cmd(USART2, ENABLE); //使能串口
USART_ClearFlag(USART2, USART_FLAG_TC);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //使能接收中断
nvicInitStruct.NVIC_IRQChannel = USART2_IRQn;
nvicInitStruct.NVIC_IRQChannelCmd = ENABLE;
nvicInitStruct.NVIC_IRQChannelPreemptionPriority = 0;
nvicInitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&nvicInitStruct);
}
用串口发送数组的函数:
void Send_Order(USART_TypeDef * USARTx,u16 *s)
{
int i;
for(i=0;i<9;i++)
{
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);
USART_SendData(USARTx,*(s+i));
}
}
TIM3中断服务函数
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
LED1=!LED1;
Send_Order(USART2,C);
}
}
主函数
int main(void)
{
TIM3_Int_Init(9999,7199);//10Khz的计数频率
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
my_usart2_init(9600);
LED_Init(); //初始化与LED连接的硬件接口
while(1)
{
LED0=!LED0;
}
}
希望大家能帮个忙,找了好久不知道错误在哪,现在挺着急的
|
|