学习内容:
第十六讲: 1.硬件连接 需要放置R38电阻是为了让小电流通过电阻直接接地,放置干扰实验。
2.软件设计 main()函数:
#include "stm32f10x.h"
#include "bsp_systick.h"
#include "bsp_led.h"
#include "fmq.h"
int main(void)
{
FMQ_GPIO_Config();
LED_GPIO_Config();
while(1)
{
FMQ(ON); //开启蜂鸣器
LED(ON); //开启LED
systick_Delay_ms(1000); //延时1s
FMQ(OFF); //关闭蜂鸣器
LED(OFF); //关闭LED
systick_Delay_ms(1000); //延时1s
}
}
?LED头文件:
#ifndef __BSP_LED_H
#define __BSP_LED_H
#include "stm32f10x.h"
#define LED_G_GPIO_PIN GPIO_Pin_0
#define LED_G_GPIO_PORT GPIOB
#define LED_G_GPIO_CLK RCC_APB2Periph_GPIOB
#define ON 1
#define OFF 0
#define LED(a) { if(a) GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN); else GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);}
void LED_GPIO_Config(void);
#endif
LED C文件:
#include "bsp_led.h"
void LED_GPIO_Config(void) //LED初始化
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK, ENABLE);
GPIO_InitStruct.GPIO_Pin=LED_G_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct);
}
毫秒级延时实现:
void systick_Delay_ms(uint32_t ms) //毫秒级延时
{
uint32_t i;
SysTick_Config(72000);
for(i=0;i<ms;i++)
{
while(!((SysTick->CTRL) &(1<<16)));
}
SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}
蜂鸣器头文件:
#ifndef __FMQ_H
#define __FMQ_H
#include "stm32f10x.h"
#define FMQ_GPIO_CLK RCC_APB2Periph_GPIOA
#define FMQ_GPIO_PIN GPIO_Pin_8
#define FMQ_GPIO_PORT GPIOA
#define ON 1
#define OFF 0
#define FMQ(a) { if(a) GPIO_SetBits(FMQ_GPIO_PORT,FMQ_GPIO_PIN); else GPIO_ResetBits(FMQ_GPIO_PORT,FMQ_GPIO_PIN);}
void FMQ_GPIO_Config(void);
#endif
?蜂鸣器C文件:
#include "fmq.h"
void FMQ_GPIO_Config(void) //蜂鸣器初始化
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(FMQ_GPIO_CLK, ENABLE);
GPIO_InitStruct.GPIO_Pin=FMQ_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(FMQ_GPIO_PORT, &GPIO_InitStruct);
}
?
?第十七讲:GPIO做输入
 1.扫描方式 一.当支持连续按下时,只要检测到低电平时,就有效。 二.当不支持连续按下时,只有当前一次检测到高电平,这次检测到低电平才有效,其余均无效。
2.实现方式 通过使用static关键字来声明变量,使变量存储在静态存储器中,实现记录上一次电平的状态。
3.代码实现 main()函数
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_key.h"
int main(void)
{
uint8_t key;
LED_GPIO_Config();
KEY_GPIO_Config();
while(1)
{
key=Key_Scan(0);
if(key==LED1)
LED_G_TOGGLE;
if(key==LED2)
LED_R_TOGGLE;
}
}
?按键头文件
#ifndef __BSP_KEY_H
#define __BSP_KEY_H
#include "stm32f10x.h"
#define KEY_ON 1
#define KEY_OFF 0
#define LED1 2
#define LED2 3
#define KEY1_GPIO_PIN GPIO_Pin_0
#define KEY1_GPIO_PORT GPIOA
#define KEY1_GPIO_CLK RCC_APB2Periph_GPIOA
#define KEY1_SCAN GPIO_ReadInputDataBit(KEY1_GPIO_PORT, KEY1_GPIO_PIN)
#define KEY2_GPIO_PIN GPIO_Pin_13
#define KEY2_GPIO_PORT GPIOC
#define KEY2_GPIO_CLK RCC_APB2Periph_GPIOC
#define KEY2_SCAN GPIO_ReadInputDataBit(KEY2_GPIO_PORT, KEY2_GPIO_PIN)
uint8_t Key_Scan(uint8_t mode);
void KEY_GPIO_Config(void);
#endif
?按键C文件
#include "bsp_key.h"
void delay(uint8_t t)
{
while(t--);
}
void KEY_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK, ENABLE);
RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK, ENABLE);
GPIO_InitStruct.GPIO_Pin=KEY1_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(KEY1_GPIO_PORT , &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=KEY2_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(KEY2_GPIO_PORT , &GPIO_InitStruct);
}
uint8_t Key_Scan(uint8_t mode)
{
static uint8_t key_up=1;
if(mode==1) key_up=1;
if((KEY1_SCAN==KEY_ON||KEY2_SCAN==KEY_ON)&&(key_up==1))
{
delay(0xFF);
key_up=0;
if(KEY1_SCAN==KEY_ON) return LED1;
if(KEY2_SCAN==KEY_ON) return LED2;
}
else if((KEY1_SCAN==KEY_OFF&&KEY2_SCAN==KEY_OFF)) key_up=1;
return KEY_OFF;
}
?LED头文件
#ifndef __BSP_LED_H
#define __BSP_LED_H
#include "stm32f10x.h"
#define LED_G_GPIO_PIN GPIO_Pin_0
#define LED_G_GPIO_PORT GPIOB
#define LED_G_GPIO_CLK RCC_APB2Periph_GPIOB
#define LED_R_GPIO_PIN GPIO_Pin_5
#define LED_R_GPIO_PORT GPIOB
#define LED_R_GPIO_CLK RCC_APB2Periph_GPIOB
#define ON 1
#define OFF 0
#define LED(a) if(a) GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN); else GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);
void LED_GPIO_Config(void);
#define LED_G_TOGGLE {LED_G_GPIO_PORT->ODR ^=LED_G_GPIO_PIN;}
#define LED_R_TOGGLE {LED_R_GPIO_PORT->ODR ^=LED_R_GPIO_PIN;}
#endif
LED C文件?
#include "bsp_led.h"
void LED_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK, ENABLE);
RCC_APB2PeriphClockCmd(LED_R_GPIO_CLK, ENABLE);
GPIO_InitStruct.GPIO_Pin=LED_G_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=LED_R_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(LED_R_GPIO_PORT, &GPIO_InitStruct);
}
第二十四讲:NVIC中断优先级管理 1.CM3内核一共有256个中断,其中有16个内核中断和240个外部中断。但stm32中只用到84个中断:16个内核中断和68个外部中断。 2.中断优先级分为抢占优先级和响应优先级。一共使用4位来配置。 抢占优先级:抢占优先级高的中断可以打断抢占优先级低的中断。 响应优先级:响应优先级高的中断无法打断响应优先级低的中断。当同时发生时,响应优先级高的先进入中断。 3.当系统代码执行过程中,只设置一次中断优先级,以免造成混乱。 4.NVIC库函数
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_Initstruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_Initstruct.NVIC_IRQChannel
NVIC_Initstruct.NVIC_IRQChannelCmd
NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority
NVIC_Initstruct.NVIC_IRQChannelSubPriority
NVIC_Init(&NVIC_Initstruct);
}
NVIC_PriorityGroupConfig为优先级分组。 NVIC_IRQChannelCmd为使能中断。 NVIC_IRQChannel为中断源。 NVIC_IRQChannelPreemptionPriority为抢占优先级。 NVIC_IRQChannelSubPriority为响应优先级。
|