1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、硬件知识-UART硬件介绍
1. 串口的硬件介绍 UART的全称是Universal Asynchronous Receiver and Transmitter,即异步发送和接收。 串口在嵌入式中用途非常的广泛,主要的用途有:
TxD线把PC机要发送的信息发送给ARM开发板。 最下面的地线统一参考地。 2. 串口的参数
‘A’的ASCII值是0x41,二进制就是01000001,怎样把这8位数据发送给PC机呢?
(2)逻辑电压 ① 前面图中提及到了逻辑电平,也就是说代表信号1的引脚电平是人为规定的。 如图是TTL/CMOS逻辑电平下,传输‘A’时的波形: 在xV至5V之间,就认为是逻辑1,在0V至yV之间就为逻辑0。 ② 如图是RS-232逻辑电平下,传输‘A’时的波形: 在-12V至-3V之间,就认为是逻辑1,在+3V至+12V之间就为逻辑0。 RS-232的电平比TTL/CMOS高,能传输更远的距离,在工业上用得比较多。 市面上大多数ARM芯片都不止一个串口,一般使用串口0来调试,其它串口来外接模块。 3. 串口电平 ARM芯片上得串口都是TTL电平的,通过板子上或者外接的电平转换芯片,转成RS232接口,连接到电脑的RS232串口上,实现两者的数据传输。 现在的电脑越来越少有RS232串口的接口,当USB是几乎都有的。因此使用USB串口芯片将ARM芯片上的TTL电平转换成USB串口协议,即可通过USB与电脑数据传输。 上面的两种方式,对ARM芯片的编程操作都是一样的。 4. 串口内部结构 ARM芯片是如何发送/接收数据? 如图所示串口结构图:
1、串口编程步骤 1.1 看原理图确定引脚
各类芯片的UART框图都是类似的,当设置好UART后,程序读写数据寄存器就可以接收、发送数据了。 3、STM32F103串口操作 3.1 看原理图确定引脚
3.2.1 使能GPIOA/USART1模块 需要设置GPIOA的寄存器,选择引脚功能:所以要使能GPIOA模块。 GPIOA模块、USART1模块的使能都是在同一个寄存器里实现。 3.2.2 配置引脚功能 从上图可以知道,PA9、PA10有三种功能:GPIO、USART1、TIMER1。 3.3 设置串口参数 3.3.1 设置波特率 波特率算公式: USARTDIV由整数部分、小数部分组成,计算公式如下: USARTDIV = DIV_Mantissa + (DIV_Fraction / 16) DIV_Mantissa和DIV_Fraction来自USART_BRR寄存器,如下图: 3.3.2 设置数据格式 比如数据位设置为8,无校验位,停止位设置为1。 需要设置2个寄存器。
typedef unsigned int uint32_t; typedef struct { volatile uint32_t SR; /*!< USART Status register, Address offset: 0x00 */ volatile uint32_t DR; /*!< USART Data register, Address offset: 0x04 */ volatile uint32_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ volatile uint32_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ volatile uint32_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ volatile uint32_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ volatile uint32_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ } USART_TypeDef; USART_TypeDef *usart1 = (USART_TypeDef *)0x40013800; 三、STM32F103 - UART编程 #include "uart.h" void delay(int d) { while(d--); } int main() { char c; uart_init(); putchar('1'); putchar('0'); putchar('0'); putchar('a'); putchar('s'); putchar('k'); putchar('n'); putchar('r'); while (1) { c = getchar(); putchar(c); putchar(c+1); } return 0; } #include "uart.h" typedef unsigned int uint32_t; typedef struct { volatile uint32_t SR; /*!< USART Status register, Address offset: 0x00 */ volatile uint32_t DR; /*!< USART Data register, Address offset: 0x04 */ volatile uint32_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ volatile uint32_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ volatile uint32_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ volatile uint32_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ volatile uint32_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ } USART_TypeDef; void uart_init(void) { USART_TypeDef *usart1 = (USART_TypeDef *)0x40013800; volatile unsigned int *pReg; /* 使能GPIOA/USART1模块 */ /* RCC_APB2ENR */ pReg = (volatile unsigned int *)(0x40021000 + 0x18); *pReg |= (1<<2) | (1<<14); /* 配置引脚功能: PA9(USART1_TX), PA10(USART1_RX) * GPIOA_CRH = 0x40010800 + 0x04 */ pReg = (volatile unsigned int *)(0x40010800 + 0x04); /* PA9(USART1_TX) */ *pReg &= ~((3<<4) | (3<<6)); *pReg |= (1<<4) | (2<<6); /* Output mode, max speed 10 MHz; Alternate function output Push-pull */ /* PA10(USART1_RX) */ *pReg &= ~((3<<8) | (3<<10)); *pReg |= (0<<8) | (1<<10); /* Input mode (reset state); Floating input (reset state) */ /* 设置波特率 * 115200 = 8000000/16/USARTDIV * USARTDIV = 4.34 * DIV_Mantissa = 4 * DIV_Fraction / 16 = 0.34 * DIV_Fraction = 16*0.34 = 5 * 真实波特率: * DIV_Fraction / 16 = 5/16=0.3125 * USARTDIV = DIV_Mantissa + DIV_Fraction / 16 = 4.3125 * baudrate = 8000000/16/4.3125 = 115942 */ #define DIV_Mantissa 4 #define DIV_Fraction 5 usart1->BRR = (DIV_Mantissa<<4) | (DIV_Fraction); /* 设置数据格式: 8n1 */ usart1->CR1 = (1<<13) | (0<<12) | (0<<10) | (1<<3) | (1<<2); usart1->CR2 &= ~(3<<12); /* 使能USART1 */ } int getchar(void) { USART_TypeDef *usart1 = (USART_TypeDef *)0x40013800; while ((usart1->SR & (1<<5)) == 0); return usart1->DR; } int putchar(char c) { USART_TypeDef *usart1 = (USART_TypeDef *)0x40013800; while ((usart1->SR & (1<<7)) == 0); usart1->DR = c; return c; } PRESERVE8 THUMB ; Vector Table Mapped to Address 0 at Reset AREA RESET, DATA, READONLY EXPORT __Vectors __Vectors DCD 0 DCD Reset_Handler ; Reset Handler AREA |.text|, CODE, READONLY ; Reset handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT main LDR SP, =(0x20000000+0x10000) BL main ENDP END #ifndef _UART_H #define _UART_H void uart_init(void); int getchar(void); int putchar(char c); #endif |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1820 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1634 浏览 1 评论
1104 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
740 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1692 浏览 2 评论
1951浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
756浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
587浏览 3评论
605浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
570浏览 3评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-31 01:42 , Processed in 0.683310 second(s), Total 47, Slave 41 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号