STM32F103 USART2接收不到数据
void MY_NVIC_Configuration(void)//配置中断优先级
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void MY_USART2_Init()
{
USART_InitTypeDef tUSART;
//NVIC_InitTypeDef NVIC_InitStructure;
/* config USART2 clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
/* USART2 mode config */
tUSART.USART_BaudRate = 250000;
tUSART.USART_WordLength = USART_WordLength_9b;
tUSART.USART_StopBits = USART_StopBits_1;
tUSART.USART_Parity = USART_Parity_No;
tUSART.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
tUSART.USART_Mode = USART_Mode_Rx;
USART_Init(USART2, &tUSART);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
MY_NVIC_Configuration();
USART_Cmd(USART2, ENABLE);
}
uint16_t DmxData[20] = {0};
uint16_t DmxHeadFlag = 0;
uint16_t UDR = 0;
uint8_t OpenRecFlag = 0;
void USART2_IRQHandler(void)
{
static uint8_t dmxaddress = 0;
if(USART2->SR&(1<<5))//接收到数据
{
UDR = USART2->DR;
DmxHeadFlag = UDR&0x100;
if(DmxHeadFlag == 0)
{
dmxaddress = 0;
OpenRecFlag = 1;
}
else
{
if(OpenRecFlag)
{
DmxData[dmxaddress++] = UDR&0xff;
}
if(dmxaddress > 10)
{
OpenRecFlag = 0;
}
}
USART2->SR &= ~(1<<5);
}
}
看SR的状态,数据感觉不正常。
计划是接收DMX512的,用的是USART2。PA3是接收脚。
IO初始化
GPIO_InitTypeDef tGPIO;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //disable JTAG and release PB3 PB4 PA15 !
/*----------------------------------------------------------------------------------*/
//USART
tGPIO.GPIO_Pin = GPIO_Pin_2;
tGPIO.GPIO_Mode = GPIO_Mode_AF_PP;
tGPIO.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &tGPIO);
tGPIO.GPIO_Pin = GPIO_Pin_3;
tGPIO.GPIO_Speed = GPIO_Speed_50MHz;
tGPIO.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &tGPIO);
- tUSART.USART_BaudRate = 250000;
- tUSART.USART_WordLength = USART_WordLength_9b;
250kbps , 9 WordLength ?
250K,8个数据位,两个停止位,然后可以看成9个数据位,1个停止位,看成数据位的停止位在正常接收到的数据下是1,也就是第9位是1的情况下,是正常数据,如果第9位数据位是0,则表示是数据的开头,数据马上就要来了。