牛人的STM32学习笔记寄存器版本.docx
- 文档编号:5853151
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:38
- 大小:48.89KB
牛人的STM32学习笔记寄存器版本.docx
《牛人的STM32学习笔记寄存器版本.docx》由会员分享,可在线阅读,更多相关《牛人的STM32学习笔记寄存器版本.docx(38页珍藏版)》请在冰豆网上搜索。
牛人的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
USART1EN
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口配置可仿以下两个程序:
voidKEY_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上拉
}
voidLED_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
USART1EN
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
UART5EN
UART4EN
UART3EN
UART2EN
保留
15
14
13
12
11
10
9
8
SPI3EN
SPI2EN
保留
WWDGEN
保留
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
USART1RST
TIM8RST
SPI1RST
TIM1RST
ADC2RST
ADC1RST
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
UART5RST
UART4RST
UART3RST
UART2RST
保留
15
14
13
12
11
10
9
8
SPI3RST
SPI2RST
保留
WWDGRST
保留
7
6
5
4
3
2
1
0
保留
TIM7RST
TIM6RST
TIM5RST
TIM4RST
TIM3RST
TIM2TST
RCC_APB1RSTR(APB1外设复位寄存器)
如:
RCC_APB1RSTR|=1<<17;//复位串口2RCC_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)的小数部分。
关于波特率设置在函数
voiduart_init(u32pclk2,u32bound)里已经设置好,并且封装在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=0010000000001100B
设置成使能串口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
参考程序:
voiduart_init(u32pclk2,u32bound)
{
floattemp;
u16mantissa;
u16fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
mantissa=temp;//得到整数部分
fraction=(temp-mantissa)*16;//得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2;//使能PORTA口时钟
RCC->APB2ENR|=1<<14;//使能串口时钟
GPIOA->CRH&=0XFFFFF00F;
GPIOA->CRH|=0X000008B0;//IO状态设置
RCC->APB2RSTR|=1<<14;//复位串口1
RCC->APB2RSTR&=~(1<<14);//停止复位
//波特率设置
USART1->BRR=mantissa;//波特率设置
USART1->CR1|=0X200C;//1位停止,无校验位.
#ifdefEN_USART1_RX//如果使能了接收
//使能接收中断
USART1->CR1|=1<<8;//PE中断使能
USART1->CR1|=1<<5;//接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART1_IRQChannel,2);//组2,最低优先级
#endif
}
voidUSART1_IRQHandler(void)
{
u8res;
if(USART1->SR&(1<<5))//接收到数据
{
res=USART1->DR;
if((USART_RX_STA&0x80)==0)//接收未完成
{
if(USART_RX_STA&0x40)//接收到了0x0d
{
if(res!
=0x0a)USART_RX_STA=0;//接收错误,重新开始
elseUSART_RX_STA|=0x80;//接收完成了
}else//还没收到0X0D
{
if(res==0x0d)USART_RX_STA|=0x40;
else
{
USART_RX_BUF[USART_RX_STA&0X3F]=res;
USART_RX_STA++;
if(USART_RX_STA>63)USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
}
以上两个函数已经封装在usart.c中可直接调用
三、外部中断
STM32的每一个IO口都可以作为中断输入,要想把IO口作为中断输入则必须将IO口设置成上拉/下拉输入或浮空输入(设置成浮空输入时要接上拉或下拉电阻否则可能导致中断不断触发)。
下面总结一下设置IO口为外部中断时的步骤:
(1)将IO口设置成输入模式
这个在第一章总结过,这里不多说。
(2)开启IO口复用时钟,设置IO口与中断线的映射关系
这一步在函数voidEx_NVIC_Config(u8GPIOx,u8BITx,u8TRIM)中已经封装好可直接调用这里说一下IO口的复用时钟使能:
15
14
13
12
11
10
9
8
ADC3EN
USART1EN
TIM8EN
SPI1EN
TIM1EN
ADC2EN
ADC1EN
IOPGEN
7
6
5
4
3
2
1
0
IOPFEN
IOPEEN
IOPDEN
IOPCEN
IOPBEN
IOPAEN
保留
AFIOEN
RCC_APB2ENR
RCC_APB2ENR|=0X01;//使能IO口复用时钟
(3)开启与该IO口相对应的线上中断/事件,并设置触发条件
这一步封装在函数voidEx_NVIC_Config(u8GPIOx,u8BITx,u8TRIM)中,可以直接调用,例如:
Ex_NVIC_Config(GPIO_A,0,RTIR);//设置PA(0)上升沿触发
Ex_NVIC_Config(GPIO_A,13,FTIR);//设置PA(13)下降沿触发
(4)配置中断分组(NVIC)并使能中断
这一步封装在函数voidMY_NVIC_Init(u8NVIC_PreemptionPriority,u8NVIC_SubPriority,u8NVIC_Channel,u8NVIC_Group)里面可以直接调用,例如:
MY_NVIC_Init(2,2,EXTI0_IRQChannel,2);//抢占2,子优先级2,组2
这里值得注意的是EXTI0、EXTI1、EXTI2、EXTI3、EXTI4为Line0~Line4
EXTI15_10为Line15~Line10EXTI9_5为Line9~Line5
(5)编写中断服务函数
例如:
voidEXTI15_10_IRQHandler(void)
{
delay_ms(10);//消抖
if(KEY0==0)//按键0
{
LED0=!
LED0;
}
elseif(KEY1==0)//按键1
{
LED1=!
LED1;
}
EXTI->PR=1<<13;//清除LINE13上的中断标志位
EXTI->PR=1<<15;//清除LINE15上的中断标志位
}
四、定时计数器中断
STM32共有8个定时计数器,其中TIME1和TIME8是高级定时器,TIME2~TIME5是通用定时器,TIME6和TIME7是基本定时器,这里以TIME3为例先总结以下定时计数器的基本用法。
定时计数器TIME3中断的配置步骤:
(1)TIME3时钟使能
31
30
29
28
27
26
25
24
保留
DACEN
PWREN
BKPEN
保留
CANEN
保留
23
22
21
20
19
18
17
16
USBEN
I2C2EN
I2C1EN
UART5EN
UART4EN
UART3EN
UART2EN
保留
15
14
13
12
11
10
9
8
SPI3EN
SPI2EN
保留
WWDGEN
保留
7
6
5
4
3
2
1
0
保留
TIM7EN
TIM6EN
TIM5EN
TIM4EN
TIM3EN
TIM2EN
RCC_APB1ENR
例如:
RCC->APB1ENR|=1<<1;//使能TIME3的时钟;
RCC->APB1ENR|=1<<2;//使能TIME4的时钟;
RCC->APB1ENR|=1<<3;//使能TIME5的时钟;
RCC->APB1ENR|=0X01;//使能TIME2的时钟使能;(RCC->APB1ENR|=1<<0;)
其余的一次类推。
15
14
13
12
11
10
9
8
ADC3EN
USART1EN
TIM8EN
SPI1EN
TIM1EN
ADC2EN
ADC1EN
IOPGEN
7
6
5
4
3
2
1
0
IOPFEN
IOPEEN
IOPDEN
IOPCEN
IOPBEN
IOPAEN
保留
AFIOEN
RCC_APB2ENR
(2)设置TIM3_ARR和TIM3_PSC的值
这两个位分别设置自动重装值及分频系数
15
14
13
12
11
10
9
8
ARR[15:
8]
7
6
5
4
3
2
1
0
ARR[7:
0]
TIMx_ARR(TIM6和TIM7自动重装载寄存器)
15
14
13
12
11
10
9
8
PSC[15:
8]
7
6
5
4
3
2
1
0
PSC[7:
0]
TIMx_PSC(TIM6和TIM7预分频器)
(3)设置TIM3_DIER允许更新中断
15
14
13
12
11
10
9
8
保留
TDE
保留
CC4DE
CC3DE
CC2DE
CC1DE
UDE
7
6
5
4
3
2
1
0
保留
TIE
保留
CC4IE
CC3IE
CC2IE
CC1IE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STM32 学习 笔记 寄存器 版本