01、上节回顾
STM32 | USART1电脑串口助手发送字符串,控制开发板LED灯案例 |
本节案例
使用串口2,完成两个开发板互相通信(一个板子通过按键控制另个板子的灯)
02、LED配置
#ifndef __LED_H
#define __LED_H
#include "stm32f4xx.h"
#define LED0_ON GPIO_ResetBits(GPIOF, GPIO_Pin_9)
#define LED0_OFF GPIO_SetBits(GPIOF, GPIO_Pin_9)
void Led_Init(void);
#endif
#include "led.h"
/*********************************
引脚说明:
LED0 -- PF9
LED1 -- PF10
LED2 -- PE13
LED3 -- PE14
**********************************/
void Led_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//使能GPIOE组时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
//使能GPIOF组时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10; //引脚9 10
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //速度
GPIO_Init(GPIOF, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14; //引脚13 14
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //速度
GPIO_Init(GPIOE, &GPIO_InitStruct);
GPIO_SetBits(GPIOF, GPIO_Pin_9);
GPIO_SetBits(GPIOF, GPIO_Pin_10);
GPIO_SetBits(GPIOE, GPIO_Pin_13);
GPIO_SetBits(GPIOE, GPIO_Pin_14);
}
03、SysTick配置
#ifndef __DELAY_H
#define __DELAY_H
#include "stm32f4xx.h"
void Delay_Init(void);
void delay_us(u32 nus);
void delay_ms(u32 nms);
#endif
#include "delay.h"
//u32 == unsigned int
u32 my_us = 21; //计21个数用1us
u32 my_ms = 21000; //计21000个数用1ms
void Delay_Init(void)
{
//SysTick时钟配置 168MHZ/8 = 21MHZ
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
}
//nus取值范围:1~798 915
void delay_us(u32 nus)
{
u32 temp = 0;
//设置重装值寄存器
SysTick->LOAD = my_us*nus - 1;
//设置计数器的值为0
SysTick->VAL = 0x00;
//开启定时器
SysTick->CTRL |= (0x01<<0);
do
{
temp = SysTick->CTRL;
//判断定时是否关闭 //判断SysTick->CTRL第16位是否为1
}while((temp&(0x01<<0)) && (!(temp & (0x01<<16))));
//关闭定时器
SysTick->CTRL &= ~(0x01<<0);
}
//nms取值范围:1~798
void delay_ms(u32 nms)
{
u32 temp = 0;
//设置重装值寄存器
SysTick->LOAD = my_ms*nms - 1;
//设置计数器的值为0
SysTick->VAL = 0x00;
//开启定时器
SysTick->CTRL |= (0x01<<0);
do
{
temp = SysTick->CTRL;
//判断定时是否关闭 //判断SysTick->CTRL第16位是否为1
}while((temp&(0x01<<0)) && (!(temp & (0x01<<16))));
//关闭定时器
SysTick->CTRL &= ~(0x01<<0);
}
void delay_s(u32 ns)
{
int i;
for(i=0; i<ns; i++)
{
delay_ms(500);
delay_ms(500);
}
}
05、按键配置
#ifndef __KEY_H
#define __KEY_H
#include "stm32f4xx.h"
void Key_Init(void);
#endif
#include "key.h"
/*********************************
引脚说明:
KEY0--PA0
KEY1--PE2
*****************************