stm32 芯片的选型,分类,挂载 及GPIO口的分析
(本文章程序均为样例,仅限于理解,如有错误还望指正)
1.嵌入式芯片的选型
STM32-F1系列:
基础型,主频为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.外部挂载分析
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 外部中断事件控制器
APB2负责AD,I/O,高级TIM,串口1。
APB1负责DA,USB,SPI,I2C,CAN,串口2345,普通TIM
#define GPIOA ((GPIO_TypeDef *)GPIOA_BASE)
1.GPIOA_BASE被强制转换为地址,空间以GPIO_TypeDef的类型进行构建,首址为GPIOA_BASE,空间内有成员,之间依各自固有类型顺序分配相应空间;
2.GPIOA宏展开,即为紧跟其后的具体内容,这样它就是一个指针了:指向以GPIOA_BASE为首址的结构体空间。所以您给出GPIOA->某成员,则操作成立,如取该成员地址、赋值等。
typedef struct
{
__IO uint32_t CRL;//0x00
__IO uint32_t CRH;//0x04字节也可以写32bit
__IO uint32_t IDR;//0x08
__IO uint32_t ODR;//0x0c
__IO uint32_t BSRR;//0x10
__IO uint32_t BRR;//0x14
__IO uint32_t LCKR;//0x18
} GPIO_TypeDef;
访问gpio_typedef各寄存器地址
GPIOB_CRL = 0x40010C00UL
GPIOB_CRH = 0x40010C04UL
GPIOB_IDR = 0x40010C08UL
GPIOB_ODR = 0x40010C0cUL
GPIOB_BSRR = 0x40010C10UL
GPIOB_BRR = 0x40010C14UL
GPIOB_LCKR = 0x40010C18UL
每一个地址相差4bit
#define GPIOA_BASE (APB2PERIPH_BASE + 0x00000800UL)
声明GPIOA_BASE的GPIOA相对于APB2的偏移地址
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000UL)
声明外设总线的地址
#define PERIPH_BASE 0x40000000UL
宏定义PERIPH_BASE的地址
#define GPIO_PIN_0 ((uint16_t)0x0001) /* Pin 0 selected */
#define GPIO_PIN_1 ((uint16_t)0x0002) /* Pin 1 selected */
#define GPIO_PIN_2 ((uint16_t)0x0004) /* Pin 2 selected */
#define GPIO_PIN_3 ((uint16_t)0x0008) /* Pin 3 selected */0000 0000 0000 1000
#define GPIO_PIN_4 ((uint16_t)0x0010) /* Pin 4 selected */
#define GPIO_PIN_5 ((uint16_t)0x0020) /* Pin 5 selected */
#define GPIO_PIN_6 ((uint16_t)0x0040) /* Pin 6 selected */
#define GPIO_PIN_7 ((uint16_t)0x0080) /* Pin 7 selected */
#define GPIO_PIN_8 ((uint16_t)0x0100) /* Pin 8 selected */
#define GPIO_PIN_9 ((uint16_t)0x0200) /* Pin 9 selected */
#define GPIO_PIN_10 ((uint16_t)0x0400) /* Pin 10 selected */
#define GPIO_PIN_11 ((uint16_t)0x0800) /* Pin 11 selected */
#define GPIO_PIN_12 ((uint16_t)0x1000) /* Pin 12 selected */
#define GPIO_PIN_13 ((uint16_t)0x2000) /* Pin 13 selected */
#define GPIO_PIN_14 ((uint16_t)0x4000) /* Pin 14 selected */
#define GPIO_PIN_15 ((uint16_t)0x8000) /* Pin 15 selected */
#define GPIO_PIN_All ((uint16_t)0xFFFF) /* All pins selected */
定义一个名为GPIO_Pin_0的符号,该符号等价于((u16)0x0001),也就是一个无符号短整型的0x0001。(其余同上)
typedef enum //用于枚举
{
GPIO_PIN_RESET = 0u,
GPIO_PIN_SET
} GPIO_PinState;
GPIO_PIN_RESET = 0U
GPIO_PIN_SET =1U
其中:
0U 表示 无符号整型 0
1U 表示 无符号整型 1