没有合适的资源?快使用搜索试试~ 我知道了~
首页牛人的STM32学习笔记(寄存器版本)
牛人的STM32学习笔记(寄存器版本)

牛人的STM32学习笔记(寄存器版本) 牛人的STM32学习笔记(寄存器版本)
资源详情
资源评论
资源推荐

一、GPIO 口的配置
STM32 的 DGPIO 口最多可以有 7 组(GPIOa~GPIOg),而每一组 GPIO 口均有 16 个双向
IO 组成。并且没个 IO 口均可配置成 8 种模式(4 种输入模式,4 种输出模式)。不管配置
哪个 IO 口也不论将其配置成哪种模式(但是配置成哪种模式要看具体应用,参考《中文参
考手册》第 105 页)都可以按以下步骤来进行配置:
(1)使能 PORTx(x=A~G)时钟
这里就得操作寄存器 RCC_APB2ENR(32 为寄存器)了
15 14 13 12 11 10 9 8
ADC3EN
USART1E
N TIM8EN SPI1EN TIM1EN ADC2EN ADC1EN IOPGEN
7 6 5 4 3 2 1 0
IOPFEN IOPEEN IOPDEN IOPCEN IOPBEN IOPAEN
保留
AFIOEN
RCC_APB2ENR 的 0~15 位(06~32 位保留)
第 2~8 分别是使能 GPIOA~GPIOG 时钟的,只要将其置“1”即可,如 RCC_APB2ENR|
=1<<2;就是使能 GPIOA 的时钟;其余 IO 口的始终使能一次类推。
(2)对相应的 IO 模式进行配置,低 8 位配置 GPIOx_CRL;高 8 位配置 GPIOx_CRH
31 30 29 28 27 26 25 24
CNF7[1:0] MODE7[1:0] CNF6[1:0] MODE6[1:0]
23 22 21 20 19 18 17 16
CNF5[1:0] MODE5[1:0] CNF4[1:0] MODE4[1:0]
15 14 13 12 11 10 9 8
CNF3[1:0] MODE3[1:0] CNF2[1:0] MODE2[1:0]
7 6 5 4 3 2 1 0
CNF1[1:0] MODE1[1:0] CNF0[1:0] MODE0[1:0]
GPIOx_CRL(x=A~G(端口配置低寄存器 x=A…E)
该寄存器用于配置 GPIOx 的低 8 位,具体 8 种模式的配置见《中文参考手册》例如:
GPIOD->CRL&=0XFFFFF0FF;GPIOD->CRL|=0X00000300;/PD.2 推挽输出;其余 IO 口
的低 8 位以此类推。
31 30 29 28 27 26 25 24
CNF15[1:0] MODE15[1:0] CNF14[1:0] MODE14[1:0]
23 22 21 20 19 18 17 16
CNF13[1:0] MODE13[1:0] CNF12[1:0] MODE12[1:0]
15 14 13 12 11 10 9 8
CNF11[1:0] MODE11[1:0] CNF10[1:0] MODE10[1:0]
7 6 5 4 3 2 1 0
CNF9[1:0] MODE9[1:0] CNF8[1:0] MODE8[1:0]
GPIOx_CRH(端口配置高寄存器 x=A…E)
该寄存器用于配置 GPIOx 的高 8 位,具体 8 种模式的配置见《中文参考手册》例如:
GPIOA->CRH&=0XFFFFFFF0;;GPIOA->CRH|=0X00000003;//PA8 推挽输出;其余 IO 口
的高 8 位以此类推。

(3)端口的输入和输出电平配置
15 14 13 12 11 10 9 8
IDR15 IDR14 IDR13 IDR12 IDR11 IDR10 IDR9 IDR8
7 6 5 4 3 2 1 0
IDR7 IDR6 IDR5 IDR4 IDR3 IDR2 IDR1 IDR0
GPIOx_IDR(端口输入数据寄存器 x=A…E)
该寄存器配置 IO 口的 0~15 位的输入数据,以 16 位读出。
15 14 13 12 11 10 9 8
ODR15 ODR14 ODR13 ODR12 ODR11 ODR10 ODR9 ODR8
7 6 5 4 3 2 1 0
ODR7 ODR6 ODR5 ODR4 ODR3 ODR2 ODR1 ODR0
GPIOx_ODR(端口输出数据寄存器 x=A…E)
该寄存器配置 IO 口的 0~15 位的输入初始状态,例如:GPIOA->ODR|=1<<13;//PA13 上拉
输入
一般 GPIO 口配置可仿以下两个程序:
void KEY_Init(void)
{
RCC->APB2ENR|=1<<2; //使能 PORTA 时钟
GPIOA->CRL&=0XFFFFFFF0;//PA0 设置成输入
GPIOA->CRL|=0X00000008;
GPIOA->CRH&=0X0F0FFFFF;//PA13,15 设置成输入
GPIOA->CRH|=0X80800000;
GPIOA->ODR|=1<<13; //PA13 上拉,PA0 默认下拉
GPIOA->ODR|=1<<15; //PA15 上拉
}
void LED_Init(void)
{
RCC->APB2ENR|=1<<2; //使能 PORTA 时钟
RCC->APB2ENR|=1<<5; //使能 PORTD 时钟
GPIOA->CRH&=0XFFFFFFF0;
GPIOA->CRH|=0X00000003;//PA8 推挽输出
GPIOA->ODR|=1<<8; //PA8 输出高
GPIOD->CRL&=0XFFFFF0FF;
GPIOD->CRL|=0X00000300;//PD.2 推挽输出
GPIOD->ODR|=1<<2; //PD.2 输出高
}

二、串口通信
STM32 最多可以提供 5 路串口,其串口配置主要有以下步骤:
(1)串口时钟使能
15 14 13 12 11 10 9 8
ADC3EN
USART1E
N TIM8EN SPI1EN TIM1EN ADC2EN ADC1EN IOPGEN
7 6 5 4 3 2 1 0
IOPFEN IOPEEN IOPDEN IOPCEN IOPBEN IOPAEN
保留
AFIOEN
RCC_APB2ENR 的 0~15 位(16~32 位保留)
在寄存器 RCC_APB2ENR 里的第 14 位就是对串口 1 的时钟使能即:
RCC_APB2ENR|=1<<14; //使能串口 1 时钟 , 那么除串口 1 的时钟使能在 RCC_APB2ENR
外其余的时钟使能位在寄存器 RCC_APB1ENR 里,看下表:
31 30 29 28 27 26 25 24
保留
DACEN PWREN BKPEN
保留
CANEN
保留
23 22 21 20 19 18 17 16
USBEN I2C2EN I2C1EN
UART5E
N
UART4E
N
UART3E
N
UART2E
N
保留
15 14 13 12 11 10 9 8
SPI3EN SPI2EN
保留
WWDGE
N
保留
7 6 5 4 3 2 1 0
保留
TIM7EN TIM6EN TIM5EN TIM4EN TIM3EN TIM2EN
RCC_APB1ENR
例如:RCC_APB1ENR|=1<<17; //使能串口 2 时钟 ,其余串口时钟使能以此类推。
(2)串口复位即结束复位
STM32 在使用串口时不管当前该串口出于什么状态都先要将其复位,而复位后要将其
结束复位。串口复位主要在寄存器 RCC_APB1RSTR(串口 1 的复位)和寄存器
RCC_APB2RSTR(其余串口复位)这两个寄存器如下表
15 14 13 12 11 10 9 8
ADC3RST
USART1R
ST TIM8RST SPI1RST TIM1RST
ADC2RS
T
ADC1RS
T IOPGRST
7 6 5 4 3 2 1 0
IOPFRST IOPERST IOPDRST IOPCRST IOPBRST IOPARST
保留
AFIORST
RCC_APB2RSTR(APB2 外设复位寄存器)
寄存器 RCC_APB2RSTR 的第 14 位是进行串口 1 的复位如:RCC_APB1RSTR|=1<<14; //将
串口 1 复位 ,然后结束复位 RCC_APB1RSTR|=~(1<<14); //结束串口 1 复位

其余串口复位在寄存器 RCC_APB1RSTR 里如下表:
31 30 29 28 27 26 25 24
保留
DACRST PWRRST BKPRST
保留
CANRST
保留
23 22 21 20 19 18 17 16
USBRST I2C2RST I2C1RST
UART5R
ST
UART4R
ST
UART3R
ST
UART2R
ST
保留
15 14 13 12 11 10 9 8
SPI3RST SPI2RST
保留
WWDGR
ST
保留
7 6 5 4 3 2 1 0
保留
TIM7RST TIM6RST TIM5RST TIM4RST TIM3RST TIM2TST
RCC_APB1RSTR(APB1 外设复位寄存器)
如: RCC_APB1RSTR|=1<<17; //复位串口 2 RCC_APB1RSTR|=~(1<<17); // 结束串口
2 复位 ,其余串口复位操作以此类推。
(3)串口波特率设置
15 14 13 12 11 10 9 8
DIV_Mantissa[11:4]
7 6 5 4 3 2 1 0
DIV_Mantissa[3:0] DIV_Fraction[3:0]
USART_BRR(波特比率寄存器)
该寄存器的 15-4 位:DIV_Mantissa[11:0]USARTDIV 的整数部分,这 12 位定义了
USART 分频器除法因子(USARTDIV)的整数部分;3-0 位:DIV_Fraction[3:0]USARTDIV 的
小数部分,这 4 位定义了 USART 分频器除法因子(USARTDIV)的小数部分。关于波特率设
置在函数
void uart_init(u32 pclk2,u32 bound)里已经设置好,并且封装在 usart.c 文件里面可以直接调
用。
(4)串口控制
STM32 的每个串口都有 3 个控制寄存器(USART_CR1~3)控制,例如 USART_CR1 如下:
15 14 13 12 11 10 9 8
保留
UE M WAKE PCE PS PEIE
7 6 5 4 3 2 1 0
TXEIE TCIE RXNEIE IDLEIE TE RE RWU SBK
USART_CR1(控制寄存器 1)
该寄存器 32~14 位保留,第 13 位使能串口(任何串口在应用的时候都必需将其置“1”)
第 12 位设置字长,当这位为“0”的时候设置串口位 8 个字长外加 n 个停止位,这 n 个停止位

在寄存器 USART_CR2 中第[13:12]位来决定。PCE 为奇偶校验使能位设置为“0”则禁止校验,
否则使能校验。PS 是交验选择位,设置为“0”则为偶校验,否则为奇校验。PEIE:PE(校
验错误)中断使能,该位由软件设置或清除,定义:0(禁止产生中断),1(当
USART_SR 中的 PE 为’1’时,产生 USART 中断)。TXEIE 发送缓冲区空中断使能,(手
动),定义:0(禁止产生中断),1(当 USART_SR 中的 TXE 为’1’时,产生 USART 中
断)。TCIE 发送完成中断使能,(手动),定义:0(禁止产生中断)1(当 USART_SR 中
的 TC 为’1’时,产生 USART 中断)。RXNEIE 接收缓冲区非空中断使能,(手动),定义:
0(禁止产生中断),1(当 USART_SR 中的 ORE 或者 RXNE 为’1’时,产生 USART 中断)。
TE 为发送使能位,设置为“1”将开启串口的发送功能。RE 为接收使能位,用法同 TE。
15 14 13 12 11 10 9 8
保留
LINEN STOP[1:0] CLKEN CPOL CPHA LBCL
7 6 5 4 3 2 1 0
保留
LBDIE LBDL
保留
ADD[3:0]
USART_CR2(控制寄存器 2)
如:USART1->CR1|=0X200C; //1 位停止,无校验位. 0X200C=0010 0000 0000 1100B
设置成使能串口 8 个字长 1 个停止位(USART_CR2 中[13:12]默认为“0”)禁止校验,禁止
校验所有中断,使能发送和接收。
(5)数据发送和接收
15 14 13 12 11 10 9 8
保留
DR[8]
7 6 5 4 3 2 1 0
DR[7:0]
USART_DR(数据寄存器)
发送数据缓存寄存器(向它写数据它会自动发送数据),当接收到数据时则存放接收的数
据
(6)串口控制
15 14 13 12 11 10 9 8
保留
CTS LBD
7 6 5 4 3 2 1 0
TXE TC RXNE LDLE ORE NE FE PE
USART_SR
参考程序:
void uart_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到 USARTDIV
剩余27页未读,继续阅读












安全验证
文档复制为VIP权益,开通VIP直接复制

评论3