GPIO
输入浮空 | 逻辑器件的输入引脚即不接高电平,也不接低电平。由于逻辑器件的内部结构,当它输入引脚悬空时,相当于该引脚接了高电平。一般实际运用时,引脚不建议悬空,易受干扰 |
---|---|
输入上拉 | 将不确定信号通过电阻接到Vcc,电阻限流,强弱由阻值决定 |
输入下拉 | 接到GND |
模拟输入 | 模拟输入是指传统方式的输入.数字输入是输入PCM数字信号,即0,1的二进制数字信号,通过数模转换,转换成模拟信号,经前级放大进入功率放大器,功率放大器还是模拟的。 |
开漏输出 | 输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内). |
推挽输出 | 可以输出高,低电平,连接数字器件; 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源低定 |
推挽式复用功能 | 可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用) |
开漏式复用功能 | 可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用) |
实验
1.通用IO口输出
跑马灯
原理:采用推挽输出强高低电平控制led的on/off:默认上拉led灭
使能IO时钟 | RCC_AHB1PeriphClockCmd() |
---|---|
初始化IO口 | gpio_init(){GPIO_Pin,GPIO_Mode,GPIO_OType,GPIO_Speed,GPIO_PuPd} |
操作IO口,输出高低电平 | GPIO_SetBits() / GPIO_ResetBits() |
蜂鸣器
原理:检测输入
ps:不能IO口直接驱动大功率器件,考虑io的驱动电流设计电路:三极管扩流,电阻防止小电流误发声。
2:通用IO口输入
按键
使能IO时钟 | 同out |
---|---|
初始化IO口 | 同out |
获取输入状态 | GPIO_ReadInputDataBit() |
delay_ms(10); | 延时一定时间防抖(按键稳定) |
按键操作分为
1:支持连续按(eg:音量键)
2:不支持连续按(eg:电源键)
//mode 0:不支持连续按
//mode 1:支持连续按
U8 key_scan(u8 mode)
{
Static u8 key_flag=1;
if(mode)key_flag=1;//
if(key_flag&&KEY按下){
delay_ms(10);
key_flag=0;//标记按下
if(KEY确实按下){
return KEY_VALUE;}
}
else if(KEY没按) key_flag=1;
}
3:串口通信
1:并行通信:数据各个位同时传输(8位8个口):速度快,占用引脚多
2:串行通信:数据按位顺序:占用引脚烧,速度慢
》根据数据传输
单工
半双工
全双工
》根据时钟信号
·······同步:带时钟同步信号:SPI IIC
·······异步:UART:约定:baudrate,校验.
步骤 | |
---|---|
时钟 | 串口时钟使能,GPIO 时钟使能 |
设置引脚复用器映射 | GPIO_PinAFConfig() |
GPIO 初始化设置 | 设置mode为AF |
串口参数初始化 | USART_Init(){BaudRate,WordLength,StopBits,Parity,HardwareFlowControl,Mode(rx/tx)} |
使能串口 | USART_Cmd() |
开启中断 | {USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); |
初始化 NVIC | USART1_IRQn}NVIC_Init() |
编写中断处理函数 | USART1_IRQHandler():可设计通信协议 eg:(数据以0x0d 0x0a结尾) |
4:外部中断实验
每个 IO 都可以作为 :外部中断的中断输入口
GPIO 跟中断线的映射关系(中断线16个:对应与GPIOx.0–GPIOx.15)
步骤 | |
---|---|
使能 IO 口时钟/初始化 IO 口为输入 | gpio_init()/AHBclkcmd() |
使能 SYSCFG 时钟/设置 IO 口与中断线的映射关系 | RCC_APB2PeriphClockCmd()/SYSCFG_EXTILineConfig(); |
初始化线上中断,设置触发条件 | EXTI_Init(){line,mode,trigger,linecmd} |
配置中断分组(NVIC),并使能中断 | NVIC_init() |
中断服务函数 | EXTIx_IRQHandler |
5:看门狗实验
独立看门狗:程序跑飞复位
内部低速(LSI) 从KR写入0xcccc开始启动,0xfff计数递减到0x000时复位:在中间写入0xaaaa时重载计数(喂狗)写0x5555取消(pre rlr)写保护
(IWDG)
步骤 | |
---|---|
取消寄存器写保护(向 IWDG_KR 写入 0X5555 | IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); |
设置独立看门狗的预分频系数和重装载值 | IWDG_SetPrescaler()/void IWDG_SetReload(){Tout=((4×2^prer) ×rlr) /40 } |
重载计数值喂狗(向 IWDG_KR 写入 0XAAAA | IWDG_ReloadCounter(); |
启动看门狗 | IWDG_Enable(); |
窗口看门狗:通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序 背离正常的运行序列而产生的软件故障
(设置)上窗口-----------》下窗口(0x3f):之间喂狗
两边复位 0x40有中断也复位(EWI:早期唤醒中断)
(WWDG)
步骤 | |
---|---|
使能 WWDG 时钟 | RCC_APB1PeriphClockCmd() |
设置窗口值和分频数 | WWDG_SetWindowValue()/ WWDG_SetPrescaler() |
开启 WWDG 中断并分组 | WWDG_EnableIT(); |
设置计数器初始值并使能看门狗 | WWDG_Enable()/ WWDG_SetCounter() |
编写中断服务函数 | wwdg_IRQHandler() |
6:定时器中断实验