内容:
1、stm32标准库函数开发手册
2、查看工程中用到的函数
3、GPIO等驱动的使用
4、LED配置及使用
5、按键配置及使用
6、外部中断配置及使用
7、串口配置及使用
8、定时器配置及使用
1、stm32标准库函数开发手册
https://download.csdn.net/download/qasxc78563/11456538
2、查看工程中用到的函数
3、GPIO等驱动的使用
4、GPIO配置(LED)使用
1)定义结构体变量
2)初始化硬件时钟
3)对结构体变量的成员配置(引脚、输入/输出模式、输出类型、速度、上下拉电阻)
4)初始化结构体变量,使结构体变量配置信息生效
// 1)定义结构体变量
GPIO_InitTypeDef GPIO_InitStructure;
// 2)初始化硬件时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
/* 3) 初始化 PF9 PF10 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
//使结构体变量信息生效
GPIO_Init(GPIOF, &GPIO_InitStructure);
// LED灯置1灭,置0亮
GPIO_WriteBit(GPIOF,GPIO_Pin_9,(BitAction)1);
GPIO_WriteBit(GPIOF,GPIO_Pin_10,(BitAction)1);
5、按键控制
// 定义结构体变量
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能硬件始时 GPIOE */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
/* 配置 PE2 PE3 PE4 信息 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; //选择引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 选择输输入
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
//使配置信息生效
GPIO_Init(GPIOE, &GPIO_InitStructure);
//等待引脚被按细 GPIO-->输入--->按键按下 ---->消抖
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)
{
delay_ms(10); //消抖
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)
{
//判断一下灯的状态
if(GPIO_ReadOutputDataBit(GPIOF,GPIO_Pin_10)==1)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_10);
}
else
{
GPIO_SetBits(GPIOF,GPIO_Pin_10);
}
}
//等待按键 松开
while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0);
}
6、外部中断配置使用
1)定义GPIO结构体变量、EXTI结构体变量、NVIC结构体变量
2)配置GPIO时钟、系统时钟(SYSCFG)
3)配置中断引脚的GPIO信息(引脚、输入模式、上下拉电阻,初始化结构体变量,使结构体变量配置信息生效)
4)将GPIO引脚连接到对应的中断线
5)配置EXTI(中断线)信息(控制线、中断模式、触发方式、启用,初始化结构体变量,使结构体变量配置信息生效)
6)配置中断优先级组
7)中断优先级NVIC设置(中断线通道、抢占优先级、子优先级、IRQ通道被使能、初始化NVIC寄存器)
8)编写中断处理函数
(8.1)检测中断线是否真的被触发
(8.2)中断处理
(8.3)清除中断线的中断标志位
int main(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* 使能 GPIOA 硬件时钟 */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
/* 使能 SYSCFG 硬件时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
/* 配置 PA0 输入模式 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 将 pa0 链接到 EXTI Line0 */
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
/* 配置外部中断线0 EXTI Line0 */
EXTI_InitStructure.EXTI_Line = EXTI_Line0; //外部中断控制线0
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //以 打断 的方式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //以上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //启用
//使配置信息生效
EXTI_Init(&EXTI_InitStructure);
//配置 优先级组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2 2 00 --11 0-3 0000
/* 使能并且 配置 EXTI Line0 优先级*/
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //配置外部中断通断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; //配置抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //配置 响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//使配置信息生效
NVIC_Init(&NVIC_InitStructure);
led_Init();
while(1);
}
//中断处理函数
void EXTI0_IRQHandler(void)
{
//检测中断是否真的被触发
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
/* Toggle LED1 */
GPIO_ToggleBits(GPIOF, GPIO_Pin_9);
/* 清除中断标志位 EXTI line 0 */
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
7、串口配置使用
1)定义GPIO结构体变量、USART结构体变量、NVIC结构体变量
2)配置GPIO时钟、USARTx时钟(SYSCFG)
3)配置USARTx的TX和RX引脚的GPIO信息(引脚、模式、输出类型、速度、上下拉电阻,初始化结构体变量,使结构体变量配置信息生效)
4)将GPIO引脚连接到对应的USARTx(GPIO复用)
5)配置USARTx信息(波特率、数据长度、停止位、校验位、硬件流控、串口功能,初始化结构体变量,使结构体变量配置信息生效)
6)配置中断优先级组
7)中断优先级NVIC设置(串口中断通道、抢占优先级、子优先级、IRQ通道被使能、初始化NVIC寄存器)
8)允许串口中断接收数据,启用 USARTx
9)串口中断处理函数的编写
(9.1)检测接收标志位
(9.2)接收数据
(9.3)判断数据是否接收完成
(9.4)清除串口中断
#include "stdio.h"
#include "stm32f4xx.h"
#include "delay.h"
#include "led.h"
#include "string.h"
char RecvDate[20]; //接受完成数据
char Tbuf[20]; //临时存放数据
int Recvflag=0;
void SendString(USART_TypeDef* USARTx, char *dat);
void USART1_Config(int BaudRate);
int main(void)
{
USART1_Config(9600);
led_Init();
while(1)
{
//LED1_ON LED1_OFF
//判断数据是否== LED1_ON
if(strncmp(RecvDate,"LED1_ON",7)==0)
{
GPIO_ResetBits(GPIOF, GPIO_Pin_9);
SendString(USART1,"LED1_ON\r\n");
//清空数组数据
memset(RecvDate,0,20);
}
if(strncmp(RecvDate,"LED1_OFF",8)==0)
{
GPIO_SetBits(GPIOF, GPIO_Pin_9);
memset(RecvDate,0,20);
}
}
}
void USART1_Config(int BaudRate)
{
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/*使能 GPIO 时钟*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
/*使能 USART1 时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
/* 将 PA9 PA10 链接 到 USART1 */
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
/* 配置 USART1 Tx(PA9 ) 和 Rx(PA10 ) */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//配置串口1相关信息
USART_InitStructure.USART_BaudRate = BaudRate; //配置波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据长度
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位1
USART_InitStructure.USART_Parity = USART_Parity_No; //无校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //不需要硬件流控
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //串口功能:接收数据和发送数据
USART_Init(USART1, &USART_InitStructure);
/* NVIC configuration */
/* 配置优先级组 两位 抢占,2位 响应 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/* 使能 USART1 中断*/
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //选择串口中断通道1
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 允许串口中断接收数据
USART_ITConfig(USART1, USART_IT_RXNE,ENABLE);
/*启用 USART1 */
USART_Cmd(USART1, ENABLE);
}
//串口中断服务函数
void USART1_IRQHandler(void)
{
/* 检测接收标志位 */
if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
/* 接受数据 固定数据格式 LED1_ON\r\n*/
Tbuf[Recvflag++]= USART_ReceiveData(USART1);
if(Tbuf[Recvflag-1]=='\n' && Tbuf[Recvflag-2]=='\r')
{
//数据接受完成
memset(RecvDate,0,sizeof(RecvDate));
strcpy(RecvDate,Tbuf);
Recvflag=0;
memset(Tbuf,0,sizeof(Tbuf));
}
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
}
}
//发送数据到串口
void SendString(USART_TypeDef* USARTx, char *dat)
{
//判断数据数据 是否是 '\0',是代表发送数据完成
while(*dat!='\0')
{
//检测是否可以发送数据
while(!USART_GetFlagStatus(USARTx,USART_FLAG_TXE));
//将数据发送过去
USART_SendData(USARTx,*dat);
//让指针指向下一个字符
dat++;
}
}
8、定时器配置及使用
1)定义TIM结构体变量、NVIC结构体变量
2)配置TIMx时钟
3)配置TIM结构体信息(自动重装值、时钟预分频数、时钟分割、计数模式、初始化TIMx的时间基数单位)
4)使能指定的TIMx中断,允许更新中断
5)设置NVIC中断分组
6)中断优先级NVIC设置(TIMx中断、抢占优先级、子优先级、IRQ通道被使能、初始化NVIC寄存器)
7)使能TIMx
8)定时器中断服务程序
(8.1)检查TIMx更新中断发生与否
(8.2)中断处理
(8.3)清除TIMx更新中断标志位
void TIM2_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
//定时器TIM2初始化
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM2中断,允许更新中断
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
TIM_Cmd(TIM2, ENABLE); //使能TIMx
}
//定时器2中断服务程序
void TIM2_IRQHandler(void) //TIM2中断
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查TIM2更新中断发生与否
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除TIMx更新中断标志
GPIO_ToggleBits(GPIOE, GPIO_Pin_14);
}
}
//定时器2初始化函数调用
TIM2_Int_Init(1999,7199);//10Khz的计数频率,计数到2000为200ms