刚开始学习单片机STM32F103C8的使用,按行业惯例,肯定是资深点灯工程师要出场了。
所有对外设的操作,都可以分为以下三步:
1、打开外设对应的时钟;
2、设置端口用途;
3、对外设(对应寄存器)进行读写操作。
本示例中也是按照这个步骤进行操作的。
方法 1:直接操作寄存器
本程序中,使用对单片机寄存器的地址操作的方式进行编程。相较库函数的方法,这种方法虽然可读性差一些,但更容易理解底层是如何配置并工作的。
#include "stm32f10x.h"
int main(void)
{
//第一步:打开时钟,通过RCC_APB2ENR寄存器,代码中RCC_BASE是RCC的基地址,0x18时APB2ENR的地址偏移量,下同
//打开PORTB时钟
*(unsigned int *)(RCC_BASE+0x18) |= 1<<3;
//第二步:配置端口用途,通过GPIOx_CRL和GPIOx_CRH寄存器
//配置端口PORTB为推挽输出
*(unsigned int *)(GPIOB_BASE+0x00) |= 0x33333333;
*(unsigned int *)(GPIOB_BASE+0x04) |= 0x33333333;
//第三步:输出高电平或低电平,通过GPIOx_ODR寄存器
//控制PORTB ODR寄存器,本示例代码的效果为,输出PB0为低电平,其余PB1~PB15为高电平
*(unsigned int *)(GPIOB_BASE+0x0C) =0xFFFE;
while(1);
}
方法2:使用固件函数库
如下为固件函数库程序版本。
函数库版本的优势是方便易读,厂家用很多函数对寄存器的操作做了封装。核心思想是,用程序的复杂换取人类阅读的方便。
#include "stm32f10x.h"
//采用STM官方提供的固件库进行GPIO的操作
int main(void)
{
//第一步:打开PROTB时钟
//RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB,ENABLE);//这是错的函数,耗费了好多时间
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//第二步:配置端口用途,配置端口PORTB为推挽输出
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);//初始化
//第三步:输出高电平或低电平
//本示例代码的效果为,输出PB0为低电平,其余PB1~PB15为高电平
GPIO_WriteBit(GPIOB,GPIO_Pin_All,1);
GPIO_WriteBit(GPIOB,GPIO_Pin_0,0);
//GPIO_Write(GPIOB,0xFFFE); //这条指令可达到与上两条同样的效果
}