stm32学习(标准库)

本笔记基于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);清除标注位,跳出中断
	}
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值