#define USART1 ((USART_TypeDef *) USART1_BASE)
对于上述已知:USART1_BASE 地址为 0x4001 3800;
USART_TypeDef 为已经定义的结构体;
那么USART1 是怎么得到地址0x4001 3800
谢谢!
求助:关于STM32 结构体定义
答案:2 悬赏:20 手机版
解决时间 2021-01-28 19:26
- 提问者网友:你独家记忆
- 2021-01-27 19:49
最佳答案
- 五星知识达人网友:何以畏孤独
- 2021-01-27 21:08
#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行。
即#define USART1 ((USART_TypeDef *) 0x4001 3800)
就句话的意思是,0x4001 3800是一个指向USART_TypeDef结构体的指针,现在给这指针取了一个名字USART1。
至于这个0x4001 3800是怎么来的,请看RM0008 Reference manual 文档51 页 TABLE3的第7行。
全部回答
- 1楼网友:忘川信使
- 2021-01-27 21:59
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
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯