三、STM32F407VET6使用串口2当做调试口

        1、第二章建立好的定时器点灯程序

        2、编译环境MDK5(KEIL5)   

        3、一个STM32F407VET6硬件

        4、一个下载器j-link 或 st-link等

        5.代码编辑器 Notepad++   (可以不要 用记事本也能编译  都是习惯的问题)

        6.USB转TTL设备  用于连接电脑串口助手

壹、复制定时器点灯程序

1.1 复制定时器点灯程序并进行重命名

1.2 进入USER/BSP文件夹下 复制BSP_LED文件夹改为BSP_DEBUG

1.3 进入USER/BSP/BSP_DEBUG文件夹,修改文件名

贰、编写BSP_DEBUG.c与BSP_DEBUG.h代码

2.1 打开BSP_DEBUG.h修改为

#ifndef __BSP_DEBUG_H
#define __BSP_DEBUG_H
 
#include "stm32f4xx.h"
 
#include <string.h> 
#include <stdio.h> 
 
extern     void BSP_DEBUG_Init(uint32_t bound);
extern    void DEBUGx_Send_hex(uint8_t* p,uint16_t length);
extern    void DEBUGx_Send_ascii(uint8_t* p,uint16_t length);
 
 
#endif 

2.2 打开BSP_DEBUG.c修改为   其他串口也可使用此程序 但需要将#if 1  修改为#if 0  这段代码用于printf 重映射的  只需要一个串口就够了

#include "BSP_DEBUG.h"
 

#include <string.h>  


//定义一个宏 以后改起来方便只需要修改宏就可以
//使用PA9 PA10 用于uart1   根据自己实际硬件修改

#define BSP_DEBUGx_RX_PIN             GPIO_Pin_6
#define BSP_DEBUGx_RX_GPIO_PORT       GPIOD
#define BSP_DEBUGx_RX_GPIO_CLK        RCC_AHB1Periph_GPIOD

#define BSP_DEBUGx_TX_PIN             GPIO_Pin_5
#define BSP_DEBUGx_TX_GPIO_PORT       GPIOD
#define BSP_DEBUGx_TX_GPIO_CLK        RCC_AHB1Periph_GPIOD

#define BSP_DEBUGx                    USART2
#define BSP_DEBUGx_RX_IRQn            USART2_IRQn
#define BSP_DEBUGx_RX_Priority        3                       
#define BSP_DEBUGx_RX_IRQHandler      USART2_IRQHandler
#define BSP_DEBUGx_CLK                RCC_APB1Periph_USART2

#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 

    int handle; 
}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 

    x = x; 

//重定义fputc函数 
int fputc(int ch, FILE *f)
{     
    while((BSP_DEBUGx->SR&0X40)==0);//循环发送,直到发送完毕   
    BSP_DEBUGx->DR = (uint8_t) ch;      
    return ch;
}
#endif


#define BSP_DEBUG_REC_LEN              200      //定义最大接收字节数 200
uint8_t BSP_DEBUG_RX_BUF[BSP_DEBUG_REC_LEN]={0};     //接收缓冲,最大USART_REC_LEN个字节.
uint16_t BSP_DEBUG_RX_BUF_LEN=0;       //接收状态标记      

void BSP_DEBUG_Send_hex(uint8_t* p,uint16_t length)
{
    uint16_t t;    
    for(t=0;t<length;t++)
    {        
        while((BSP_DEBUGx->SR&0X40)==0);
        BSP_DEBUGx->DR=p[t];

    }
}
void BSP_DEBUG_Send_ascii(uint8_t* p,uint16_t length)
{
        uint16_t i;
    printf("\r\n");

    for(i =0;i<length;i++)
    {
        printf(" %02X ",p[i]);
    }
    printf("\r\n");
        
}
void BSP_DEBUGx_Notification(uint8_t* p,uint16_t length)
{
//    BSP_DEBUG_Send_hex(p,length);
    BSP_DEBUG_Send_ascii(p,length);
}

void BSP_DEBUG_Init(u32 bound)
{       
    
  GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    RCC_AHB1PeriphClockCmd(BSP_DEBUGx_TX_GPIO_CLK | BSP_DEBUGx_RX_GPIO_CLK,ENABLE); //使能GPIOA时钟
    RCC_APB1PeriphClockCmd(BSP_DEBUGx_CLK,ENABLE);//使能USART2时钟
    
  //串口2引脚复用映射
    GPIO_PinAFConfig(BSP_DEBUGx_TX_GPIO_PORT,GPIO_PinSource5,GPIO_AF_USART2); //GPIOA2复用为USART2
    GPIO_PinAFConfig(BSP_DEBUGx_RX_GPIO_PORT,GPIO_PinSource6,GPIO_AF_USART2); //GPIOA3复用为USART2
    
    //TX    
  GPIO_InitStructure.GPIO_Pin = BSP_DEBUGx_TX_PIN ; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;    //速度100MHz
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
    GPIO_Init(BSP_DEBUGx_TX_GPIO_PORT,&GPIO_InitStructure); //初始化PA2,PA3

    //RX    
  GPIO_InitStructure.GPIO_Pin =  BSP_DEBUGx_RX_PIN; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;    //速度100MHz
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
    GPIO_Init(BSP_DEBUGx_RX_GPIO_PORT,&GPIO_InitStructure); //初始化PA2,PA3
    

   //USART2 初始化设置
    USART_InitStructure.USART_BaudRate = bound;//波特率设置
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    USART_InitStructure.USART_StopBits = USART_StopBits_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(BSP_DEBUGx, &USART_InitStructure); //初始化串口2
    
  USART_Cmd(BSP_DEBUGx, ENABLE);  //使能串口 2
    
    USART_ClearFlag(BSP_DEBUGx, USART_FLAG_TC);
    
    
    USART_ITConfig(BSP_DEBUGx, USART_IT_RXNE, ENABLE);//开启接受中断

    //Usart2 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = BSP_DEBUGx_RX_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=BSP_DEBUGx_RX_Priority;//抢占优先级3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =5;        //子优先级3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器、

}


void BSP_DEBUGx_RX_IRQHandler(void)                    //串口1中断服务程序
{
    
    uint8_t data;
    data = data;//去掉data未使用警告
    if(BSP_DEBUGx->SR & 0X0F) // 出错废弃
    {
        USART_ClearFlag(BSP_DEBUGx,USART_FLAG_PE|USART_FLAG_FE|USART_FLAG_NE|USART_FLAG_ORE);
        data = BSP_DEBUGx->DR;
    }
    else if(BSP_DEBUGx->SR & USART_FLAG_RXNE) //中间接收数据
    {
        if(BSP_DEBUG_RX_BUF_LEN < BSP_DEBUG_REC_LEN)
        {
                BSP_DEBUG_RX_BUF[BSP_DEBUG_RX_BUF_LEN] = BSP_DEBUGx->DR;
                BSP_DEBUG_RX_BUF_LEN++;
                if(BSP_DEBUG_RX_BUF_LEN == 1)
                {
                    USART_ClearFlag(BSP_DEBUGx,USART_FLAG_IDLE);
                    USART_ITConfig(BSP_DEBUGx, USART_IT_IDLE,ENABLE); 
                }
        }
    }
    else if(BSP_DEBUGx->SR & USART_FLAG_IDLE)//一帧结束
    {
        data = BSP_DEBUGx->SR;
        data = BSP_DEBUGx->DR;
        USART_ClearFlag(BSP_DEBUGx,USART_FLAG_IDLE);
        USART_ITConfig(BSP_DEBUGx, USART_IT_IDLE,DISABLE);
        /*****************************************/

        BSP_DEBUGx_Notification(&BSP_DEBUG_RX_BUF[0],BSP_DEBUG_RX_BUF_LEN);
        /*****************************************/    
        
        memset(BSP_DEBUG_RX_BUF,0,sizeof(BSP_DEBUG_RX_BUF));
        BSP_DEBUG_RX_BUF_LEN = 0;    
    } 

叁、打开工程,将BSP_DEBUG.c添加入工程并添加头文件路径

肆、修改main函数

#include "stm32f4xx.h"

#include "BSP_DELAY.h"
#include "BSP_LED.h"
#include "BSP_TIMER.h"
#include "BSP_DEBUG.h"


int main(void)
{
    BSP_DELAY_Init(168);           //延时初始化
    BSP_LED_Init();              //LED初始化    
    BSP_TIMER_Init(8400,1000);
    BSP_DEBUG_Init(115200);
    
    printf(" START... \r\n");
    while(1)
    {

//        CPU_LED_ON;
//        BSP_DELAY_ms(500);
//        CPU_LED_OFF;
        BSP_DELAY_ms(500);
        printf("running... \r\n");
        
    
    }
}


 

伍、编译下载

4.1 好家伙 乱码  软件和我设置的波特率一致啊   

4.2 突然发现时钟乱着呢  外部晶振和软件的参数对应不上  建立工程的时候应该发现  这会儿才发现  stm32f4xx.h   HSE_VALUE  改为8M    system_stm32f4xx.c   PLL_M改为8

4.3 时钟改完之后显示正常了

  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值