本笔记基于b站江协科技学习
芯片:stm32F103C8T6
关于单片机的外设简述
NVIC:嵌套向量中断控制器(管理中断,分配优先级)
SysTick:系统滴答定时器(提供定时服务)
RCC:复位和时钟控制,决定CPU的速率(相当于单片机的心脏,每次程序都要打开时钟,否则外设无法工作)
GPIO:通用IO口 (有八种输入输出方式)
AFIO:复用IO口
EXTI:外部中断
TIM:定时器(分为高级,通用和基本定时器)
ADC:模数转化器
USART:同步异步串口
I2C/SPI:通讯协议
GPIO的基本使用
新建一个工程
工程文件的指向关系,在后面的EXTI中老师通过debuge的调试,当程序跑完一个流程后会回到startup这个文件(包括mian)
点亮LED
一:使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//打开GPIOA
为什么用APB2线:APB2配置所有普通IO口,AFIO口,以及UART1,SPI,TIM1等
二:GPIO的初始化
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
调用结构体,新变量命名为GPIO_InitStructure(这个名字是推荐使用)
端口的输入输出方式
打开GPIO的哪个引脚
选取引脚速度(一般都是50Hz)
完成GPIO的初始化,将结构体变量回到GPIO_Init函数
GPIO_ResetBits(GPIOA, GPIO_Pin_0);//将io口低电平
GPIO_SetBits(GPIOA, GPIO_Pin_0);//将io口高电平
关于对GPIO输入输出方式
GPIO_Mode_AIN 模拟输入
GPIO_Mode_IN_FLOATING 浮空输入
GPIO_Mode_IPD 下拉输入
GPIO_Mode_IPU 上拉输入
GPIO_Mode_Out_OD 开漏输出
GPIO_Mode_Out_PP 推挽输出
GPIO_Mode_AF_OD 复用开漏
GPIO_Mode_AF_PP 复用推挽
在老师点亮LED课程中,用的是推挽输出(高低电平均有一定驱动能力),但在单片机通常遵循是高电平弱驱动。
在推挽输出中,将LED正级接3.3V,用PA0低电平可以使LED点亮;或者将LED负级接GND,用PA0高电平可以使LED点亮
当使用开漏输出时,LED正级接3.3V,用PA0低电平可以使LED点亮,而当LED负级接GND,用PA0高电平可以不能将LED点亮
由上述得知推挽输出(高低电平均有一定驱动能力),开漏输出(高电平无驱动能力)
输入方式老师用了按键控制LED灯的亮灭来演示,可以像前面的LED来测试输入方式的不同
外部中断
配置
由上图从左到右进行外部中断的配置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
开启时钟:GPIO和AFIO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = ;
GPIO_InitStructure.GPIO_Pin = ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
对GPIO口进行配置
GPIO_EXTILineConfig(GPIO_PortSourceGPIOx, GPIO_PinSourcex);
选择AFIO通道
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = ;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = ;
EXTI_Init(&EXTI_InitStructure);
对外部中断进行配置
1)选择通道 2)打开线程 3)选择中断 4)触发方式
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_x);
选择NVIC的分组
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = ;//EXTI与NVIC连线选择
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ;//抢断优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = ;//响应优先级
NVIC_Init(&NVIC_InitStructure);
中断函数
void EXTIx_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line0) == SET)//判断外部中断线是否有效
{
EXTI_ClearITPendingBit(EXTI_Linex);清除标注位,跳出中断
}
}