牛人的STM32学习笔记寄存器版本.docx

上传人:b****5 文档编号:5853151 上传时间:2023-01-01 格式:DOCX 页数:38 大小:48.89KB
下载 相关 举报
牛人的STM32学习笔记寄存器版本.docx_第1页
第1页 / 共38页
牛人的STM32学习笔记寄存器版本.docx_第2页
第2页 / 共38页
牛人的STM32学习笔记寄存器版本.docx_第3页
第3页 / 共38页
牛人的STM32学习笔记寄存器版本.docx_第4页
第4页 / 共38页
牛人的STM32学习笔记寄存器版本.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

牛人的STM32学习笔记寄存器版本.docx

《牛人的STM32学习笔记寄存器版本.docx》由会员分享,可在线阅读,更多相关《牛人的STM32学习笔记寄存器版本.docx(38页珍藏版)》请在冰豆网上搜索。

牛人的STM32学习笔记寄存器版本.docx

牛人的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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1