一、业务需求与分析
需求:用STM32F407芯片实现在串口调试工具中发送‘open’开灯,发送‘close’关灯
分析:1、先点个灯,点灯需要初始化GPIO引脚,然后调用GPIO_ResetBits拉低电平即可点亮
2、配置串口
二、实现步骤
1、先查原理图,查看LED的引脚和电平,高电平拉低可点亮、引脚为PF9和PF10


2、查看时钟所在总线的三种方法
(1)查看参考手册---存储器和总线架构---找到对应的引脚所在的总线---开时钟
(2)查看固件库手册



(3)在函数中直接跳转

3、根据时钟所在总线(AHB1)开时钟,初始化引脚(GPIO_Init)
#include "led.h"
#include "stm32f4xx.h" // Device header
void LED_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOF, &GPIO_InitStruct);
}
void LEDR_OPEN(void)
{
GPIO_ResetBits(GPIOF, GPIO_Pin_9|GPIO_Pin_10);
}
void LEDR_Close(void)
{
GPIO_SetBits(GPIOF, GPIO_Pin_9|GPIO_Pin_10);
}
4、配置串口1
(1)查看原理图,开时钟(AHB1、APB2),初始化引脚(PA9、PA10)

#include "ustart.h"
void Usart1_Config(void)
{
//开时钟---串口1、GPIOA9、GPIOA10、
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
//引脚初始化
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
(2)F407与F103的不同,要加上(GPIO_PinAFConfig)这个函数才能使用,这是将GPIOA上的引脚9和10复用成串口1(USART1)的功能
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
(3)初始化串口
//初始化串口
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.USART_BaudRate = 115200;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_Init( USART1, &USART_InitStruct);
(4)中断三步走---分组管理(只需一次在主函数)、配置中断源、配置中断优先级
//配置中断源
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//配置中断优先级
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStruct);
//使能串口
USART_Cmd(USART1, ENABLE);
(5)想要使用printf打印字符到屏幕上,需要重映射以及使用 MicroLIB库

int fputc(int ch, FILE *f)
{
USART1->DR = (uint8_t)ch;
while(0 == (USART1->SR&(1<<6)));
USART1->SR &= ~(1<<6);
return ch;
}
5、主函数调用
#include "stm32f4xx.h" // Device header
#include "led.h"
#include "ustart.h"
#include "stdio.h"
int main(void)
{
LED_Config();
Usart1_Config();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
printf("hello\r\n");
while(1){;}
}
6、时钟树调参
F407芯片官方的固件库并不是将8MHZ配置成168MHZ,而是将25MHZ配置成168MHZ,所以我们接8MHZ的外部晶振需要重新配置时钟树(图为官方配置)


两种办法配置:
1、直接使用函数配置 RCC_PLLConfig(RCC_PLLSource_HSE, 8, 336, 2, 7, 0)
2、修改固件库的参数


该博客围绕用STM32F407芯片实现串口控制灯开关展开。先进行业务需求与分析,明确要点。实现步骤包括查原理图确定LED引脚和电平、查看时钟所在总线、开时钟并初始化引脚、配置串口1、主函数调用以及时钟树调参等,还提及F407与F103的差异及时钟树配置方法。

9535

被折叠的 条评论
为什么被折叠?



