STM32F407---配置串口点灯

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

一、业务需求与分析

需求:用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、修改固件库的参数

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值