摘要:总线挂载的外设有等。外设地址映射片上外设区分为三条总线,根据外设速度的不同,不同总线挂载着不同的外设,挂载低速外设,和挂载高速外设。
STM32-F1系列(如图2-1):
基础型,主频为72M(内核为cortex-M3),CPU位数=32。
我们所用的芯片是STM32F103vet6
STM32表示产品的类型,以STM32F103VET6为例
F表示通用系列的子系列
103代表增强型系列
V代表的引脚数100引脚
E代表内嵌flash数6代表32K字节Flash,8代表64K字节Flash,B代表128K字节Flash,C代表256K字节Flash,D代表384K字节Flash,E代表512K字节Flash。
T代表封装其中H代表BGA封装,T代表LQFP封装,U代表VFQFPN封装。
6这一项代表工作温度范围,其中6代表-40——85℃,7代表-40——105℃。
图2-1
APB1总线挂载的外设有:DAC、PWR、BKP、bxCAN、USB、I2C2、I2C1、UART5、UART4、USART3、USART2、SPI3/I2S、SPI2/I2S、IWDG、WWDG、RTC、TIM7、TIM6、TIM5、TIM4、TIM3、TIM2等。
APB2总线挂载的外设有:ADC1、ADC2、ADC3、USART1、SPI1、TIM1、TIM8、GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG、EXT、IAFIO等。
APB1:
DAC:数模转化
PWR:电源功耗控制
BKP:备份数据
BxCAN:CAN总线是一种通信方式。STM32主要负责程序的运行,而CAN总线只是一种通信协议。STM32之间的通信可以通过CAN总线进行数据交换
USB 虚拟接口
I2C 串行通信协议,i2c接口
UART 调试串口
USART通用同步/异步接收器
SPI串行外设接口
IWDG独立看门狗
WWDG 窗口看门狗
RTC实时时钟
TIM 定时器
APB2:
ADC模数转换
GPIO(abcdef)
EXT 外部中断事件控制器
存储器映射是指把芯片中或芯片外的FLASH,RAM,外设,BOOTBLOCK等进行统一编址。即用地址来表示对象。这个地址绝大多数是由厂家规定好的,用户只能用而不能改。用户只能在挂外部RAM或FLASH的情况下可进行自定义。
图2-2
存储器Block0内部区域功能划分
①选项字节:用于配置读写保护、BOR级别、软件/硬件看门狗以及器件处于待机或停止模式下的复位。当芯片不小心被锁住之后,我们可以从RAM 里面启动来修改这部分相应的寄存器位。地址范围为:0x1FFF F800 - 0x1FFF F80F。
②系统存储器:里面存的是ST出厂时烧写好的isp自举程序(即Bootloader),用户无法改动。串口下载的时候需要用到这部分程序。地址范围为:0x1FFF F000- 0x1FFF F7FF。
③FLASH:我们的程序就放在这里。地址范围为:0x0800 0000 ~ 0x0807 FFFF (512KB)。
④取决于BOOT引脚,为FLASH、系统存储器、SRAM的别名。地址范围为:0x0000 0000 ~ 0x0007 FFFF。
⑤其他为预留。
储存器Block1内部区域功能划分
Block1用于设计片内的SRAM。我们使用的STM32F103VET6芯片的 SRAM是64KB,Block1内部区域的功能划分SRAM(64KB)地址范围为:0x2000 0000 ~0x2000 FFFF,其他预留。
内部 SRAM 区的大小是 512MB,用于让芯片制造商连接片上的SRAM,这个区通过系统总线来访问。在这个区的下部,有一个1MB的区间,被称为“位带区”。该位带区还有一个对应的、32MB的“位带别名(alias)区”,容纳了8M个“位变量”(对比8051的只有128个位变量)。位带区对应的是最低的1MB地址范围,而位带别名区里面的每个字对应位带区的一个比特。位带操作只适用于数据访问,不适用于取指。通过位带的功能,可以把多个布尔型数据打包在单一的字中,却依然可以从位带别名区中,像访问普通内存一样地使用它们。
储存器Block2内部区域功能划分:
Block2用于设计片内的外设,根据外设的总线速度不同,Block被分成了 APB(APB1和APB2)和AHB两部分,Block2内部区域功能划分:
①APB1总线外设,地址范围为:0x4000 0000 ~ 0x4000 77FF;
②APB2总线外设,地址范围为:0x4001 0000 ~ 0x4001 3FFF;
③AHB总线外设,地址范围为:0x4001 8000 ~ 0x5003 FFFF;
存储器Block2是片上外设区域,它们以四个字节为一个单元,共32bit,每一个单元对应不同的功能,当我们控制这些单元时就可以驱动外设工作。
如果直接驱动地址的话会非常麻烦并且不具有通用性。
比如GPIOB端口的输出数据寄存器ODR的地址是0x4001 0C0C,寄存器是32bit,低16bit有效,对应着16个外部 IO,写0/1对应的的IO则输出低/高电平。
片上外设区分为三条总线,根据外设速度的不同,不同总线挂载着不同的外设,APB1挂载低速外设,APB2和AHB挂载高速外设。
图2-3
图2-4
图2-5
图2-6
图2-7
寄存器地址 = 基地址 + 偏移地址
GPIOB_CRL = 0x4001 0C 00UL
GPIOB_CRH = 0x4001 0C 04UL
GPIOB_IDR = 0x4001 0C 08UL
GPIOB_ODR = 0x4001 0C 0CUL
GPIOB_BSRR = 0x4001 0C 10UL
GPIOB_BRR = 0x4001 0C 14UL
GPIOB_LCKR = 0x4001 0C 18UL
由此推出
GPIOA_CRL =0x4001 08 00UL
GPIOC_CRL =0x4001 10 00UL
…
c语言最小类型:字节类型,位bit,32bit=4字节
连续存储节省空间
定义的结构体和寄存器大小一一对应,将基地址与结构体绑定,操作结构体相当于操作寄存器
结构体指针用‘->’赋值,普通变量用‘.’赋值,在程序中多用指针寻址,需认真学习
HES外部高速时钟,HSI内部高速时钟
图2-8
图2-9
图2-10
图2-11
图2-12
图2-13 配置内部时钟
图2-14
点击右上角:GENERATE CODE生成项目文件
源码(点亮LED灯,LED1闪烁):
//主程序部分 /* USER CODE BEGIN WHILE */ while (1) { Scan_keys(); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_6,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,GPIO_PIN_SET); HAL_Delay(500); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,GPIO_PIN_RESET); HAL_Delay(500); } /* USER CODE END 3 */ 注:需要注意代码规范,将代码写在/* USER CODE BEGIN 1 */ /* USER CODE END1 */ 里,否则更改CubeMX时注释块之外的内容会被删除
代码释义:
两个GPIO输出的HAL库函数
1、GPIO电平输出HAL库函数
void HAL_GPIO_WritePin(GPIO_TypeDefGPIOx,unit16_tGPIO_Pin,GPIO_PinState PinState);
三个参数:
GPIOx:目标引脚端口号
GPIO_pin:目标引脚引脚号
PinState:高电平—GPIO_PIN_SET;
低电平—GPIO_PIN_RESET;
2、GPIO电平翻转HAL库函数
void HAL_GPIO_TogglePin(GPIO_TypeDefGPIOx,unit16_tGPIO_Pin);
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/121239.html
32单片机固件库入门(当我们新建工程时…的各种配置和目录结构)–学习笔记 一,关于keil5内部的一系列配置 由于下述代码的存在 每次如果想要包含stm32f10x_conf.h 只需要包含#include stm32f10x.h语句,同时包含下述宏定义 #ifdef USE_STDPERIPH_DRIVER #include stm32f10x_conf.h#endif 该宏定义可以在IDE中...
摘要:严格地说,应该是模仿实验。为什么觉得无从下手,看资料没有头绪经验总结看资料需要计划耐心和速度这里所谓的资料包括书籍文档。建议有报销条件的同学自己设计一块板子学习。无法报销的同学,可以选购一款开发板学习。 STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARMCortex...
摘要:我首先百度简单了解了架构和架构的区别,以我个人的理解是架构代表之前的复杂指令集,而架构代表着精简指令集。而我这次的学习的重点并不是围绕着指令集,而是基于架构的开发板的应用上。以上就是我本次学习架构的笔记和心路历程。 作为新手第一次接触RISC-V架构时。我首先百度简单了解了ARM架构和RIS...
摘要:处理器拥有的寄存器组。主堆栈指针复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程包括中断服务例程。进程堆栈指针由用户的应用程序代码使用。堆栈指针的最低两位永远是,这意味着堆栈总是字节对齐的。 ...
阅读 1874·2021-09-27 13:35
阅读 3427·2019-08-30 14:16
阅读 2481·2019-08-30 10:52
阅读 858·2019-08-29 16:35
阅读 1414·2019-08-29 15:22
阅读 3640·2019-08-23 18:21
阅读 3129·2019-08-23 18:00
阅读 3121·2019-08-23 16:50