使用百问网的STM32F103MINI开发板完成下面实验。
1、串口基本知识。
TXD默认是高电平。
开始位是1位低电平。
发送字符'a','a'的ASCII码是0x41,0100 0001,bit0=1,bit1/2/3/4/5=0,bit6=1,bit7=0。
校验位,以前数据传输没那么稳定常使用,现在经常不使用,
偶校验就是数据位和校验位的1个数和是偶数。
停止位可以是1位、1.5位、2位。
115200,8N1 是最常用的串口数据格式,波特率115200,8位数据,无校验,1位停止。
2、使用MINI开发板通过寄存器进行编程。
①别名设置。
typedef unsigned int uint32_t;
typedef struct
{
volatile uint32_t SR;
volatile uint32_t DR;
volatile uint32_t BRR;
volatile uint32_t CR1;
volatile uint32_t CR2;
volatile uint32_t CR3;
volatile uint32_t GTPR;
} USART_TypeDef;
②初始化设置。
void uart_init(void)
{
USART_TypeDef *usart1 = (USART_TypeDef*)0x40013800;
volatile unsigned int *pReg;
pReg = (unsigned int*)(0x40021000 + 0x18);
*pReg |= (1<<2) | (1<<14); //使能GPIO和串口时钟
pReg = (unsigned int*)(0x40010800 + 0x4);
*pReg &= ~((3<<4) | (3<<6));
*pReg |= (1<<4) | (2<<6); //10M速率,复用推挽输出
usart1->BRR = (4<<4) | (5); //设置波特率115200
usart1->CR1 = (1<<13) | (0<<12) | (0<<10) | (1<<3) | (1<<2);
usart1->CR2 &= ~(3<<12); //设置数据格式8N1
}
③接收函数。
int getchar(void)
{
char c;
USART_TypeDef *usart1 = (USART_TypeDef*)0x40013800;
while((usart1->SR & (1<<5)) == 0); //等待RXNE接收非空
c = usart1->DR;
return c;
}
④发送函数。
int putchar(char c)
{
USART_TypeDef *usart1 = (USART_TypeDef*)0x40013800;
while((usart1->SR & (1<<7)) == 0); //等待TXE发送为空
usart1->DR = c;
return c;
}
⑤主函数操作。
int main(void)
{
char c;
uart_init();
putchar('H');
putchar('e');
putchar('l');
putchar('l');
putchar('o');
putchar('\n'); //这个是回车,回到第二行的与第一行结尾同样位置
// putchar('\r'); //回到一行的开头
while(1)
{
c = getchar();
putchar(c);
putchar(c + 1);
}
}
3、实验结果。
通过Moba接收串口数据,Moba发送1后接收到1和2,第二行列位置是第一行列位置的结尾,
这个问题可以通过putchar('r')解决。