永发信息网

求助:关于STM32 结构体定义

答案:2  悬赏:20  手机版
解决时间 2021-01-28 19:26
#define USART1 ((USART_TypeDef *) USART1_BASE)
对于上述已知:USART1_BASE 地址为 0x4001 3800;
USART_TypeDef 为已经定义的结构体;
那么USART1 是怎么得到地址0x4001 3800
谢谢!
最佳答案
#define USART1 ((USART_TypeDef *) USART1_BASE)
即#define USART1 ((USART_TypeDef *) 0x4001 3800)
就句话的意思是,0x4001 3800是一个指向USART_TypeDef结构体的指针,现在给这指针取了一个名字USART1。
至于这个0x4001 3800是怎么来的,请看RM0008 Reference manual 文档51 页 TABLE3的第7行。
全部回答
stm32学习笔记——测试闪灯程序 created on: 2012-10-28 author: zhang bin 学习笔记 for stm32f103c8 redesigned by zhang bin 2012-10-28 versions:v-0.1 all rights reserved //所使用的是stm32f103c8共有48个管脚,共有两组gpio,为gpioa和gpiob,每组有从0到15共16个引脚 //注意对stm32f103c8的操作和对库函数的使用,在使用时,要时刻参考《stm32f10xxx使用手册》和《stm32的函数说明》这两个文档 #include "stm32f10x_lib.h" gpio_inittypedef gpio_initstructure; //定义gpio配置的结构体变量 包括gpio引脚,引脚速度,引脚模式 errorstatus hsestartupstatus; //枚举类型,错误状态变量定义 存储外部高速时钟hse状态 void rcc_configuration(void); //rcc配置函数 rcc:复位和时钟控制 void nvic_configuration(void); //nvic配置函数 nvic:嵌套向量中断控制器 void delay(vu32 ncount); int main(void) { #ifdef debug debug(); #endif rcc_configuration(); //系统时钟配置函数 nvic_configuration(); //nvic配置函数 //使能apb2总线外设时钟 apb1,apb2两条连接总线的外设。具有多个预分频器用于配置ahb的频率,高速apb(apb2)和低速apb(apb1) //区域。ahb和高速apb的最高频率为72mhz,低速apb的最高频率为36mhz //apb2是的i/o脚可达18mhz的反转速度 //ahb到apb(1,2)桥,该桥用来连接所有的apb设备 //两个ahb/apb桥在ahb和两个apb总线之间提供完全同步地方连接。apb1被限制在36mhz,apb2工作在全速状态(根据设备的不同 //可以达到72mhz) //有些外设连接到apb1上,有些外设连接到apb2上,具体的情况参看使用手册。 //所以在外设使用前,要先调用函数使能相应总线的时钟 //通用输入/输出gpio 备用输入/输出afio //io端口寄存器必须以32位字的方式访问,不允许以半字或者字节的方式访问 rcc_apb2periphclockcmd(rcc_apb2periph_gpioa | rcc_apb2periph_gpiob | rcc_apb2periph_afio, enable); //使能相应的外设的时钟 //这里使能gpioa,gpiob和备用io (afio)的时钟 //gpio_pinremapconfig(gpio_remap_swj_disable, enable); //关闭调试 端口重新映射 使用仿真器调试时,不能用此语 //下面是gpio的设置,注意方法 //配置相应的io。注意配置io功能时,使用的是gpio配置的结构体。前面已经定义了gpio的结构体变量 gpio_initstructure.gpio_pin = gpio_pin_all; // 选择所有脚 #define gpio_pin_all ((u16)0xffff) gpio_initstructure.gpio_mode = gpio_mode_out_pp; //配置成推挽式输出 gpio_initstructure.gpio_speed = gpio_speed_50mhz; //输出模式下 i/o输出速度 50m hz gpio_init(gpioa, &gpio_initstructure); //用定义的结构体初始化pa口 gpio_init(gpiob, &gpio_initstructure); //用定义的结构体初始化pb口 while (1) { gpio_write(gpiob, (u16)~gpio_readoutputdata(gpiob)); //写一个字数据到pb口 写入的数据是当前gpiob读取的值然后取反 //就相当于把gpiob的值取反 delay(0x8fffff); // 延时 gpio_write(gpiob, (u16)~gpio_readoutputdata(gpiob)); //写一个字数据到pb口 把gpiob的值取反 delay(0x8fffff); // 延时 } } //复位和时钟设置函数 注意配置的方法 void rcc_configuration(void) { //复位rcc外部设备寄存器到默认值 rcc_deinit(); //将外设rcc寄存器重设为缺省值 //打开外部高速晶振 rcc_hseconfig(rcc_hse_on); //设置外部高速晶振hse rcc_hse_on:打开hse晶振,rcc_hse_off:关闭hse晶振 //rcc_hse_bypass:hse晶振被外部时钟旁路 //等待外部高速时钟准备好 hsestartupstatus = rcc_waitforhsestartup(); //等待hse起振,返回错误状态。前面已经定义了errorstatus枚举类型的变量 //hsestartupstatus,success:hse晶振稳定且就绪,error:hse晶振未就绪 if(hsestartupstatus == success) //外部高速时钟已经准备好 { //开启flash的预取功能 flash_prefetchbuffercmd(flash_prefetchbuffer_enable); //使能或失能预取指缓存,flash_prefetchbuffer_enable:预取指缓存使能 //flash_prefetchbuffer_disable:预取指缓存失能 //flash延迟2个周期 flash_setlatency(flash_latency_2); //设置flash存储器代码延时时钟周期数,可以设置flash_latency_0:0延时周期, //flash_latency_1:1延时周期,flash_latency_2:2延时周期 //配置ahb(hclk)时钟=sysclk rcc_hclkconfig(rcc_sysclk_div1);//设置ahb时钟是系统时钟sysclk的多少分频,这里设为1分频,还可以指定2,4,8,16,64,128,256,512 //分频 //配置apb2(pclk2)钟=ahb时钟 rcc_pclk2config(rcc_hclk_div1); //设置高速ahb时钟apb2是ahb的多少分频,这里设为1分频,还可以指定为2,4,8,16分频 //配置apb1(pclk1)钟=ahb 1/2时钟 rcc_pclk1config(rcc_hclk_div2); //设置低速ahb时钟apb1是ahb的多少分频,这里设为2分频,还可以指定为1,2,4,8,16分频 //配置pll时钟 == 外部高速晶体时钟*9 pllclk = 8mhz * 9 = 72 mhz rcc_pllconfig(rcc_pllsource_hse_div1, rcc_pllmul_9); //设置pll时钟及倍频系数 第一个参数设置pll的输入时钟源 //可以有rcc_pllsource_hsi_div2:hsi时钟频率除以2,rcc_pllsource_hse_div1:hse时钟频率,rcc_pllsource_hse_div2: //hse时钟频率除以2 //第二个参数设置pll的倍频系数,可以是2~16倍频,这里设为9倍频 //警告:必须正确设置软件,使pll输出时钟频率不超过72mhz //使能pll时钟 rcc_pllcmd(enable); //使能或失能pll,参数可以取enable或disable,如果pll被用于系统时钟,那么它不能被失能 //等待pll时钟就绪 while(rcc_getflagstatus(rcc_flag_pllrdy) == reset) //检查指定的rcc标志位设置与否,输入参数为待检查的rcc标志位 //其取值情况详见《stm32的函数说明(中文)》p211.返回值为rcc_flag的新状态,set或reset { } //配置系统时钟 = pll时钟 rcc_sysclkconfig(rcc_sysclksource_pllclk); //设置系统时钟sysclk,输入参数用于指定用作系统时钟的时钟源 //可以为:rcc_sysclksource_hsi:选择hsi作为系统时钟,rcc_sysclksource_hse:选择hse作为系统时钟,rcc_sysclksource_pllclk //选择pll作为系统时钟 //检查pll时钟是否作为系统时钟 while(rcc_getsysclksource() != 0x08) //函数rcc_getsysclksource()返回用作系统时钟的时钟源。 //返回值可以是:0x00:hsi作为系统时钟,0x04:hse作为系统时钟,0x08:pll作为系统时钟 { } } } //嵌套向量中断控制器配置函数 void nvic_configuration(void) { #ifdef vect_tab_ram nvic_setvectortable(nvic_vecttab_ram, 0x0); //设置向量表的位置和偏移,第一个参数指定向量表的位置在ram还是在 //程序存储器flash中,取值可以是nvic_vecttab_ram:向量表位于ram, nvic_vecttab_flash:向量表位于flash。第二个参数为 //向量表基地址的偏移量,对于flash,该参数值必须高于0x08000100,对于ram,必须高于0x100.它同时必须是256(64*4)的整数倍 #else nvic_setvectortable(nvic_vecttab_flash, 0x0); #endif } void delay(vu32 ncount) { for(; ncount != 0; ncount--); } #ifdef debug //assert_failed编写于文件main.c或其他用户c文件中 void assert_failed(u8* file, u32 line) { while (1) { } } #endif
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
股票买入后是否可以立刻抛出
我女朋友生日,想放首歌能表达我爱她,以后会
靖江陈士荣牌提篮冷冻汤包哪里有卖啊??
光纤涂覆机这款设备哪家单位做 要国产和进口
请问下在昆明那里卖天梭手表的打折打的多?谢
劳资女友都有过四五个了,同居的都有过两个,
古意伤害罪自首的判几个月
有谁知道苏州新区东泰精密模具厂工资待遇,先
【秋天古诗大全】秋天的古诗大全
山癖的意思是什么啊?知道的请说下!
情战家族
人民币是我国的法定货币,但国家不能任意发行
什么叫资金池
铋离子的毒性大吗?
世图教育学费能退吗
推荐资讯
三舒体育用品(福建)有限公司 注册信息怎么找
(6分)下图甲表示某生物膜结构,a、b、c、d表
太阳能量来源于:A. 核裂变B. 核聚变C. 其它
vivox5max手机拖动抖屏 浏览网页 缓慢下拉网
什么是状态空间
单选题2006年5月27日印尼爪哇岛发生里氏6.2级
摩托车五个档位应是几根线路
人民法院做出的撤销公安机关具体行政行为的判
断缣的意思是什么啊?知道的请说下!
从农行转账11万到建行需要多少费用
短路后不亮了
mpchc与mpcbe有什么区别
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?