stm32的哪个stm32寄存器手册的

STM32直接操作寄存器
09:55:16来源: eefocus
本来stm32用库函数多么方便,但之前用51都喜欢,感觉库函数太方便了,方便到连stm32底层都可以无视掉了。看着手册,觉得直接操作寄存器很简单,但我却自己忽视了一些小细节,(就差一个强制转换,而且这个还是我自己在库函数中看到的)搞到我头大,而且网上没有人认真提出这个问题,这牛角尖钻了我好久。怒了!真的怒了!
正题:就老套的以基本的------点亮一盏灯为例吧。
(1)、如果使用库函数
先得建立好stm32库函数工程模板,然后在模板下这样操作:
&&&&&&&&& GPIO_InitTypeDef&&& GPIO_InitS&&&& //结构体 初始化
&&&&&&&&& RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
&&&&&&&&& GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
&&&&&&&&& GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
&&&&&&&&& GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;&&&
&&&&&&&&& GPIO_Init(GPIOA , &GPIO_InitStructure);
&&&&&&&&&&GPIO_Write(GPIOA,0xff);
&&&&&&&&&&while(1);
(2)、库函数工程模板下的直接寄存器操作:
当然,库函数下可以直接对寄存器进行操作的。
&&&&&&&&& RCC->APB2ENR|=1<<2; &&&& &//使能PORTA时钟&&
&&&&&&&&& GPIOA->CRL =0x;
&&&&&&&&& GPIOA->CRH =0x;
&&&&&&&&& GPIOA->ODR =0x0001;
(3)、虽然库函数里也可以直接操作寄存器,但总感觉不是自己亲手写的感觉。
所以,还可以不用库函数工程模板,全部自己定义:
#define GPIOCRL (int *)0x&&&&&&//注意一定要加强制转换(int *)
#define GPIOCRH (int *)0x&&&&&&// 此处的定义也可以用:int * GPIOCRH = (int *)0x4001804 代替。
#define GPIOODR (int *)0x4001080C
&&&&&&&&& //记得先开时钟,此处省略了
&&&&&&&&&& *GPIOCRL =0x;
&&&&&&&&&& *GPIOCRH =0x;
&&&&&&&&&& *GPIOODR =0x0001;
【总结】:对于直接操作寄存器,可以很少的代码做出很多的事情,例如一次性配置好多跟IO引脚,而库函数就要写一大堆。但直接寄存器很不方便,要自己计算那些寄存器的值,所以建议一般还是使用库函数好了....不钻牛角尖!
关键字:&&&&
编辑:什么鱼
引用地址:
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
微信扫一扫加关注 论坛活动 E手掌握
微信扫一扫加关注
芯片资讯 锐利解读
大学堂最新课程
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源
热门资源推荐
频道白皮书
何立民专栏
北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。查看: 3801|回复: 2
STM32定时器的预装寄存器及影子寄存器话题
整理:miler&shao&&&&&经常有人问起预装寄存器和影子寄存器的话题,其实STM32相关系列的手册里有介绍,有文档做介绍,这里借花献佛地一起分享下。在谈预装寄存器及影子寄存器的差别前,不妨先对STM32定时器的时基单元做个基本了解。STM32各系列的定时器结构和框架基本是一样的,时基单元也一样。&下面时基单元是以STM32F3系列为参考。&&时基单元中的TIMx_PSC、&TIM_ARR两个寄存器加上捕捉比较模块中TIMX_CCR寄存器,它们都可以动态修改。不过他们的修改和生效可能不在同一个时刻,这里便引入了预装寄存器及影子寄存器的概念。要记住一点,真正在TIMER模块中起作用的是影子寄存器。&&&1、用户程序对TIMx_PSC寄存器值的修改或读取都是操作其预装载寄存器,其修改值只能通过更新事件后才能生效,即从TIMx_PSC的预装寄存器拷贝到TIMx_PSC的影子寄存器。&&2、对于TIM_ARR寄存器的修改或读取,是直接操作影子寄存器还是先操作ARR的预装寄存器,等更新事件后拷贝到影子寄存器呢,这跟一个TIMx_CR1寄存器的ARPE位有关。如果ARPE=0,即不使用ARR的预装功能,则修改TIMx_ARR&寄存器的值就是操作影子寄存器,新的ARR的值立即生效。否则,如果ARPE=1,即使用ARR的预装功能,则修改TIMx_ARR&寄存器的值就是操作预装寄存器,直到发生更新事件后,ARR预装载寄存器的值才被拷贝到影子寄存器中。&&&&&&同样,对于TIMx_CCR的修改和读取跟TIM_ARR寄存器的修改或读取类似。是直接操作CCR影子寄存器还是先操作CCR的预装载寄存器,等更新事件后拷贝到影子寄存器呢,这跟一个TIMx_CCMRx寄存器的OCxPE位有关。如果OCxPE=0,即不使用CCR的预装载功能,则修改TIMx_CCR寄存器的值就是操作影子寄存器,新的CCR的值立即生效。否则,如果OCxPE==1,即使用CCR的预装载功能,则修改TIMx_ARR&寄存器的值就是操作预装载寄存器,要等到发生更新事件后,CCR预装载寄存器的值拷贝到影子寄存器中。明白了OCxPE位的功用后,当OCxPE==1时,就不难理解为什么做OC比较输出时,发现修改CCR寄存器的值后可能需要最长1个ARR周期的延时后才能生效。&
楼主还在吗?
写的非常好,我一个一个字的看完了
Powered by/*********************** 结构体操作点亮LED ********************************/
#include &stdint.h& //数据类型声明标准头文件
#define __IO volatile //定义__IO
//GPIO寄存器结构体定义
typedef struct {
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeD
//定义各个总线的基地址,其中APB1是所有总线的基地址
#define PERIPH_BASE ((uint32_t)0x)
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)
//根据总线的基地址,算出并定义各个GPIO的基地址
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)
#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)
#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)
#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000)
//通过指针把各个GPIO定义到其对应的基地址,后面就可以根据GPIO名来操作各个GPIO的寄存器
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)
#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)
#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)
//RCC时钟外设的地址定义,RCC是挂在AHB总线上的外设
#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
//RCC时钟结构体通过指针对应到其地址上,后面就可以用RCC直接操作各个RCC寄存器
#define RCC ((RCC_TypeDef *) RCC_BASE)
//RCC寄存器结构体定义
typedef struct {
__IO uint32_t CR;
__IO uint32_t CFGR;
__IO uint32_t CIR;
__IO uint32_t APB2RSTR;
__IO uint32_t APB1RSTR;
__IO uint32_t AHBENR;
__IO uint32_t APB2ENR;
__IO uint32_t APB1ENR;
__IO uint32_t BDCR;
__IO uint32_t CSR;
} RCC_TypeD
//将后面要操作的寄存器对应到其地址指针
#define RCC_APB2ENR *(volatile unsigned long *)0x
#define GPIOB_CRL
*(volatile unsigned long *)0x40010C00
#define GPIOB_ODR
*(volatile unsigned long *)0x40010C0C
int main(void)
//开启PB的时钟
RCC-&APB2ENR = 0x; //RCC_APB2ENR:IOPB=1
//配置PB为通用推挽输出模式,速率为2M
GPIOB-&CRL = 0x; //PB0:CNF0[1:0]=00, MODE0[1:0]=10&
GPIOB-&CRL = 0x; //PB1:CNF1[1:0]=00, MODE1[1:0]=10
GPIOB-&CRL = 0x; //PB5:CNF5[1:0]=00, MODE5[1:0]=10
GPIOB-&CRL = 0x; //PB0、PB1、PB5同时设为2M速度的推挽输出模式
//PB需输出低电平,对应LED点亮(PB0:LED_G;PB1:LED_B;PB5:LED_R)
GPIOB-&ODR = 0xFFFFFFFE; //PB0为低电平,LED_G点亮
GPIOB-&ODR = 0xFFFFFFFD; //PB1为低电平,LED_B点亮
GPIOB-&ODR = 0xFFFFFFDF; //PB5为低电平,LED_R点亮
GPIOB-&ODR = 0xFFFFFFDC; //LED_G、LED_B、LED_R同时点亮
/********************************************************************************/
/*********************** 寄存器操作点亮LED ***********************************/
//RCC时钟寄存器,所有的IO口都挂载在APB2总线上
//RCC_APB2ENR:APB2外设时钟使能控制寄存器,使能第3位(IOPB)即可
//定义RCC_APB2ENR的地址,GPIOB的基地址是0X,APB2ENR寄存器的地址偏移是0x18
#define RCC_APB2ENR *(volatile unsigned long *)0x
//方向控制:输入和输出
//CR:端口配置寄存器,分为CRL寄存器(配置P0-P7端口)和CRH寄存器(配置P8-P15端口)
//CRL的CNF[1:0]位控制端口的输入和输出,MODE[1:0]位控制输出的速度(2M/10M/50M)
//定义GPIOB_CRL的地址,GPIOB的基地址是0X,CRL寄存器的地址偏移是0x00
#define GPIOB_CRL *(volatile unsigned long *)0x40010C00
//电平控制:1-输出高电平,0-输出低电平
//ODR:Output data register,端口输出数据寄存器
//定义GPIOB_ODR寄存器的地址,GPIOB的基地址是0X,ODR寄存器的地址偏移是0x0C
#define GPIOB_ODR *(volatile unsigned long *)0x40010C0C
int main(void)
//开启PB的时钟
RCC_APB2ENR = 0x; //RCC_APB2ENR:IOPB=1
//配置PB为通用推挽输出模式,速率为2M
GPIOB_CRL = 0x; //PB0:CNF0[1:0]=00, MODE0[1:0]=10&
GPIOB_CRL = 0x; //PB1:CNF1[1:0]=00, MODE1[1:0]=10
GPIOB_CRL = 0x; //PB5:CNF5[1:0]=00, MODE5[1:0]=10
GPIOB_CRL = 0x; //PB0、PB1、PB5同时设为2M速度的推挽输出模式
//PB需输出低电平,对应LED点亮(PB0:LED_G;PB1:LED_B;PB5:LED_R)
GPIOB_ODR = 0xFFFFFFFE; //PB0为低电平,LED_G点亮
GPIOB_ODR = 0xFFFFFFFD; //PB1为低电平,LED_B点亮
GPIOB_ODR = 0xFFFFFFDF; //PB5为低电平,LED_R点亮
GPIOB_ODR = 0xFFFFFFDC; //LED_G、LED_B、LED_R同时点亮
/*******************************************************************/
与非门科技(北京)有限公司 All Rights Reserved.
京ICP证:070212号
北京市公安局备案编号: 京ICP备:号豆丁微信公众号
君,已阅读到文档的结尾了呢~~
STM32寄存器&#46;pdf寄,帮助,STM32,寄存器,pdf,PDF,stm32
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
STM32寄存器&#46;pdf
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口}

我要回帖

更多关于 stm32寄存器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信