嵌入式(2端口编程)

mac2023-01-25  28

STM32单片机的管脚命名规则

以STM32F103Cx为例,采用的封装形式为LQFP48,共有37个I/O管脚(PA口16脚+ PB口16脚+ PC口3脚+ PD口2脚)。其中stm32没有专门的读写控制线,读写控制是由某个I/O口线来控制的。

对于STM32F103xxyy系列而言: 第一个x代表引脚数:T代表36引脚,C代表48个引脚,R代表64个引脚,V代表100个引脚,Z代表144个引脚。第二个x代表内嵌的Flash容量:6代表32KB,8代表64KB,B代表128KB,C代表256KB,D代表384KB,E代表512KB。第一个y代表封装:H代表BGA封装,T代表LQFP封装,U代表QFN封装。第二个y代表工作温度范围:6代表-4085℃,7代表-40105℃。

STM32单片机的时钟配置

嵌入式进行初始化的过程,包含有RCC_Configuration(RCC:Reset Clock Control。复位和时钟设置)函数。用于系统复位和初始化STM32微控制器的时钟。

STM32系统时钟

STM32系列微控制器有5个时钟源:HSI、HSE、LSI、LSE和PLL(其中HSI、HSE或PLL可被用来驱动系统时钟,LSI和LSE作为二级时钟源,供RTC使用等) HSI:高速内部时钟,RC振荡器,频率为8MHz(精度较差)。默认打开为系统时钟。HSE:高速外部时钟,可接石英/陶瓷振荡器,或者接外部时钟源,频率范围为4~16MHz(精度高)。LSI:低速内部时钟,RC振荡器,频率30~60kHz。LSE:低速外部时钟,接频率为32.768kHz的石英晶体,供实时时钟RTC使用。PLL:锁相环倍频输出,其时钟源可选择为HSI/2、HSE或HSE/2。倍频可选择为2~16倍,但是其输出频率最大不能超过72MHz。

注:PLL:锁相回路,也称锁相环。锁相环是一种反馈控制电路,特点为:利用外部输入的参考信号控制环路内部振荡信号的频率和相位。通常用于闭环跟踪电路。

STM32外设对应的时钟使能

连接在各个总线上设备可查看上一篇:嵌入式(1绪论)。在第四部分介绍STM32微控制器的系统结构中,图中有标出接在各个总线上的设备。

我们根据外设接在不同的总线上,可以把外设时钟使能命令分为3类*(所有的外设时钟,都由RCC来控制)*: 使能接在APB1总线上的外设对应的时钟函数:RCC_APB1PeriphClockCmd()使能接在APB2总线上的外设对应的时钟函数:RCC_APB2PeriphClockCmd()使能接在AHB总线上的外设对应的时钟函数:RCC_AHBPeriphClockCmd()

注:使用按位或运算符 “ | ” 可以一次性使能多个外设时钟。

基于ARM Cortex内核的MCU和传统8/16位单片机的区别

C8051F系列单片机:通常包括3个时钟——外部时钟(高速)、内部高速时钟、内部低速时钟(供RTC使用)。虽然有多个时钟,但是没有实现高速设备配备高速时钟,低速设备配备低速时钟。且没有时钟控制开关。


基于ARM Cortex内核的单片机:通常包括4个时钟——外部高速时钟、内部高速时钟、内部低速时钟(供RTC使用)、外部低速时钟(供RTC使用)。不仅比C8051F系列单片机多一个外部低速时钟(供RTC使用); 而且实现高速时钟用高速设备,低速时钟用低速设备。时钟分开有助于实现低功耗。且有时钟控制开关,当我们需要使用某个外设模块时,要先使能该外设对应的时钟,否则不能工作。

复位和时钟配置函数RCC_Configuration()

以上是RCC寄存器映像和复位值表。

stm32单片机的RCC寄存器(复位和时钟控制)单元:包括了10个寄存器设置 一个32位的时钟控制寄存器(RCC_CR)一个32位的时钟配置寄存器(RCC_CFGR)一个32位的时钟中断寄存器(RCC_CIR)一个32位的APB2外设复位寄存器(RCC_APB2RSTR)一个32位的APB1外设复位寄存器(RCC_APB1RSTR)一个32位的AHB外设时钟使能寄存器(RCC_AHBENR)一个32位的APB2外设时钟使能寄存器(RCC_APB2ENR)一个32位的APB1外设时钟使能寄存器(RCC_APB1ENR)一个32位的备份域控制寄存器(RCC_BDCR)一个32位的控制/状态寄存器(RCC_CSR)

RCC寄存器的首地址为0x40021000。定义RCC配置寄存器的结构体RCC_TypeDef,结构体中的变量与各个外设寄存器一一对应,通过结构体来完成时钟的配置。

嵌入式系统中,volatile大量地用来描述一个对应于内存映射的输入/输出端口,或者硬件寄存器(如状态寄存器)。volatile的变量是指这个变量是易变的,可能会被意想不到的改变,这样的变量,编译器优化时,在用到这个变量时必须每次都必须访问实际地址存储器的内容,而不是使用保存在寄存器中的副本。


STM32单片机的I/O端口配置

STM32单片机最多有7个16位的并行I/O端口:PA、PB、PC、PD、PE、PF、PG。STM32F103Cx单片机只有4个16位的并行I/O端口:PA、PB、PC、PD。P代表Port端口;GPIOx为通用I/O口,其中的G代表General通用,P代表Purpose目的;AFIO为复用I/O口,其中A代表Alternate复用的,交替的,F代表Function功能。

每个GPIOx端口共有7个设置寄存器: 两个32位的配置寄存器(GPIOx_CRL,GPIOx_CRH):GPIOx端口低配置寄存器,用于配置GPIOx端口的第0位~第7位。两个32位的数据寄存器(GPIOx_IDR,GPIOx_ODR):MCS51单片机IO端口的输入、输出数据寄存器共用一个寄存器Px,STM32单片机的输入、输出寄存器是分开的。一个32位的置位/复位寄存器(GPIOx_BSRR)一个16位的复位寄存器(GPIOx_BRR)一个32位的锁定寄存器(GPIOx_LCKR) GPIO的特点: 耐压:很多I/O引脚可以承受5V。I/O引脚可以最大输出电流或吸收电流25mA(总共可吸收150mA)I/O引脚最大输出速度可达50MHz。锁定机制可以避免I/O口的寄存器的误写操作:当对一个I/O的某一位进行锁定序列操作后,该位的序列不再可能被修改,直到下一次复位。最多可达16路的模拟输入。可改变功能引脚。一个I/O引脚可用于将MCU从待机模式唤醒(PA0)。一个I/O引脚可用作防入侵引脚(PC13)。I/O引脚18MHz的翻转速度。 端口低配置寄存器(GPIOx_CRL),端口高配置寄存器(GPIOx_CRH):分别配置一个端口的低8位和高8位MODEy[1:0]:端口x的模式位 00:输入模式(复位后的状态)01:输出模式,最大速度10MHz10:输出模式,最大速度2MHz11:输出模式,最大速度50MHz CNFy[1:0]:端口x配置位 如果是在输入模式下(MODE[1:0]=00) 00:模拟输入模式01:浮空输入模式(复位后的状态)10:上拉/下拉输入模式11:保留 如果是在输出模式下(MODE[1:0]>00) 00:通用推挽输出模式01:通用开漏输出模式10:复用功能推挽输出模式11:复用功能开漏输出模式

使用按位或运算符 " | " 可以一次选中多个管脚。GPIO端口外设,无需使能即可使用,且管脚默认是浮空输入。当管脚用作输入时,只需要设置管脚和工作模式,速度不需要设置。

typedef struct { u16 GPIO_Pin; //定义引脚 GPIOSpeed_TypeDef GPIO_Speed; //设置输出速度 GPIOMode_TypeDef GPIO_Mode; //设置工作模式 }GPIO_InitTypeDef; //定义了端口参数 typedef enum { GPIO_Speed_10MHz = 1, GPIO_Speed_2MHz, GPIO_Speed_50MHz }GPIOSpeed_TypeDef; //列举出GPIO管脚的所有可能的最大响应速度 typedef enum { GPIO_Mode_AIN = 0x0, GPIO_Mode_IN_FLOATING = 0x04, GPIO_Mode_IPD = 0x28, GPIO_Mode_IPU = 0x48, GPIO_Mode_Out_OD = 0x14, GPIO_Mode_Out_PP = 0x10, GPIO_Mode_AF_OD = 0x1C, GPIO_Mode_AF_PP = 0x18 }GPIOMode_TypeDef; //列举出GPIO管脚的所有可能的工作模式

I/O端口位的复用功能配置,仅有输出,才有复用功能。而开漏输出、推挽输出和复用功能的开漏输出、推挽输出的不同之处:①引脚和输出寄存器断开,并和片上外设的输出信号连接;② 增加了复用功能Input。

虽然没有复用输入功能模式,但是当某引脚使用其复用功能,并且作为输入引脚使用时:该引脚作为复用输入使用



感觉嵌入式的整体编程框架在我的脑子里属于若隐若现的状态,整体的框架还没有很实在的理解透彻,但又知道一点大概。还是继续努力学习吧,如果有什么错误或不足之处,望指正。

最新回复(0)