单片机串口调试汇总
最近因为一个简单的单片机对PC的232串口调试,硬是折腾了我两天时间,问题是千奇百怪,为了以后自己不再在这里耽误时间,汇总问题引以为戒。
1、电路图
电容选择一般104(100nf)够用,若发现波形干扰、数据丢失现象,可加大至105(1uf)甚至106(10uf)都是可以的。
2、DB9接头,公头和母头,引脚顺序是不一样的
母头:泛指所有插槽式的接头(5针朝上,从右到左依次是1~9)
公头:泛指所有针式的接头(5针朝上,从左到右依次是1~9)
公头和母头只是引脚顺序不一样,但是引脚定义都是一样的,引脚定义如下:
开始在电路板上焊的是DB9母头,然后使用USB转串口调试。而我电路板上的引脚顺序是按照DB9公头设计的,因此引脚完全对不上,更不用说联调了!!!
3、MAX232 芯片好坏的判断
(1)MAX3232和MAX232的区别:前者是3.3V供电,后者是5V供电,其余一样
(2)先测量16脚,电压为5V正常,否则检查供电部分电路
测量2脚电压是否在 7V ~12V之间,否则更换芯片
测量6叫电压是否在-7V ~ -12V之间,否则更换芯片
因为在拆DB9的时候,不小心将供电引脚5V的导线弄断了,导致芯片根本就没有供电,换了好多个MAX232芯片后才发现问题 !_!
4、STM32F373 串口源码
void USART1_Init(u32 BaudRate)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
GPIO_DeInit(GPIOA);
//串口1对应引脚复用映射
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_7); //GPIOA9复用为USART1
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_7); //GPIOA10复用为USART1
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(GPIOA, &GPIO_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_DeInit(USART1);
USART_InitStructure.USART_BaudRate = BaudRate;
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);
USART_ClearFlag(USART1, USART_FLAG_TC);
/* USART enable */
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
USART_Cmd(USART1, ENABLE);
}
void USART_SendToPC(u8 *data, u8 n)
{
u8 i = 0;
for(i = 0; i < n; i++)
{
USART_ClearFlag(USART1, USART_FLAG_TC);
USART_SendData(USART1, data[i]);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}
}
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
RxData_USART1[RxCount_USART1++] = USART_ReceiveData(USART1);
}
if(RxData_USART1[0] != 0xBB ||RxCount_USART1 > 10)
RxCount_USART1 = 0x00;
/* 检查 ORE(数据溢出) 标志 */
if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) == SET) //打开RXNEIE,默认会同时打开RXNE和ORE中断。
{ //必须第一时间清零RXNE,如没及时清零,下一帧数据过来时就会产生Overrun error!
USART_ClearFlag(USART1, USART_FLAG_ORE); //错误就是ORE导致的。
RxData_USART1[RxCount_USART1++] = USART_ReceiveData(USART1); //解决办法要清除ORE
}
if(RxCount_USART1 == (RxData_USART1[2] + 3))
{
if(RxData_USART1[0] == 0xBB && RxData_USART1[1] == 0xAA)
{
USART_DataHandler();
}
RxCount_USART1 = 0;
}
}