STM32F105RBT6 uart调试
uart初始化:
void uart_init(u32 bound){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); //使能USART1,GPIOA时钟//USART1_TX PA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//USART1_RX PA.10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure); //Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;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(USART1, &USART_InitStructure); //初始化串口USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断USART_Cmd(USART1, ENABLE); //使能串口 }
中断处理函数:
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误
u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字节数目
u16 USART_RX_STA=0; //接收状态标记
void USART1_IRQHandler(void) //串口1中断服务程序
{u8 Res;
#ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了.OSIntEnter();
#endifif(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾){Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据if((USART_RX_STA&0x8000)==0)//接收未完成{if(USART_RX_STA&0x4000)//接收到了0x0d{if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始else USART_RX_STA|=0x8000; //接收完成了 }else //还没收到0X0D{ if(Res==0x0d)USART_RX_STA|=0x4000;else{USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;USART_RX_STA++;if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收 } }} }
#ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了.OSIntExit();
#endif
}
主函数(这里只是一个发送):
uart_init(115200);//串口1初始化while(1){ USART_SendData(USART1, 0x55);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)!=SET);//等待发送结束
}
当然我做到这一步之后看到打印出来的东西都是乱的,根本不是0x55
所以我查了一下资料,找到解决办法,这里也给记录一下
找到Stm32f10x.h这个文件,修改代码:
#if !defined HSE_VALUE#ifdef STM32F10X_CL #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */#else #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */#endif /* STM32F10X_CL */
#endif /* HSE_VALUE */
原本为250000000,修改为8000000即可
找到System_stm32f10x.c 这个文件,我这里使能的是72Mhz的时钟,所以找到这位置,修改代码:
#ifdef STM32F10X_CL/* Configure PLLs ------------------------------------------------------*//* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz *//* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV2 | RCC_CFGR2_PLL2MUL10 |RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);/* Enable PLL2 */RCC->CR |= RCC_CR_PLL2ON;/* Wait till PLL2 is ready */while((RCC->CR & RCC_CR_PLL2RDY) == 0){}/* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLMULL9);
#else /* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |RCC_CFGR_PLLMULL));RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
#endif /* STM32F10X_CL */
因为我们使用的是8Mhz的时钟,但105建议是25Mhz
按照上面的公式,PLL2CLK:8/2*10=40Mhz
PREDIV1CLK:40/5=8Mhz
所以要按此修改
STM32F105RBT6 uart调试相关推荐
- WK2204 - spi转uart调试记录
WK2204 - spi转uart调试记录 硬件 芯片简介 电路设计 驱动 添加设备树 添加驱动 调试 查看启动加载 检查串口通信 数据乱码或丢失 RS485只能收不能发 系统中断响应异常 思考 硬件 ...
- nrf52832 Uart 调试
概述: UARTE 是带有 EasyDMA 的通用异步接收器/发送器 UART.提供快速.全双工.异步的串口通信,内置流量控制(CTS,RTS)支持硬件,速率高达 1 Mbps. 官方Demo使用 S ...
- STM32F105RBT6 can调试
can 初始化: u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode) {GPIO_InitTypeDef GPIO_InitStruct ...
- UART配置调试指南
UART配置(硬件描述) 1.根据原理图,查找相关的i2c引脚对应的GPIO值,以GPIO16作为UART1_TX,GPIO17作为UART1_RX为例. 2.查找GPIO16与GPIO17对应的BL ...
- HiKey软硬件开发环境及其调试
HiKey是一款搭载华为海思麒麟620芯片,符合Linaro 96Boards标准的SBC开发板.它采用8核64位Cortex-A53处理器,主频高达1.2GHz. HiKey作为AOSP支持的一款产 ...
- 物联网硬件安全分析基础-串口调试
前言 上节介绍了关于通过编程器直接读取芯片获取固件用来静态分析的一点思路,本篇将介绍通过UART串口来直接与机器交互,通过串口输出输入信息,做动态调试. 通用异步收发传输器(Universal Asy ...
- 【瑞萨RA_FSP】UART 编程实战
文章目录 一.UART收发回显 二.UART指令控制RGB灯 三.基于环形队列的UART收发回显 一.UART收发回显 UART只需两根信号线即可完成双向通信,对硬件要求低,使得很多模块都预留UART ...
- 高通QM215 高速串口调试总结
高通QM215 高速串口调试总结 参考文档 硬件和复用情况确认 修改如下 串口调试 测试程序代码: 将串口设置为高速串口,AP端收到的数据一直为0XFD 参考文档 1.sp80-pk881-6_a_q ...
- 如何提取D-Link解密密钥
如何提取D-Link解密密钥 当我们在分析固件镜像时,遇到的最常见障碍之一便是加密.虽然已经有一些方法可用于解密固件镜像,但今天我们仍将简要介绍一下,如何提取D-Link部分路由器型号中的加密密钥,特 ...
最新文章
- 用Cordova打包Vue-vux项目
- 2020中国规模化敏捷大会-报名进行时
- 炸裂!VSCode 摸鱼神器!!!
- SQL Server 数据库巡检脚本
- Hybris Commerce下单时遇到产品库存不足的解决办法
- CDH5.16.2下载安装
- 软件工程概论总结第四章
- Spring+Hibernate 零散知识点
- Delphi LiveBinds组件
- 微信小程序 服务器代理转发,微信小程序转发功能
- VS2005中(_CRT_SECURE_NO_DEPRECATE)警告
- WordPress实现关注微信公众号回复关键字获取验证码查看网站隐藏内容
- 基于2022高考数学全国卷I概率题解题思路初步分析新冠病毒疫苗
- 1602自定义字模方法 CGRAM
- ChinaSoft 论坛巡礼 | 软件工程教育论坛
- 乘车码连不上系统服务器,支付宝乘车码无法开通的原因及开通步骤详解
- Chino with Equation (隔板法+除法取模)
- js下载文件及前端使用a标签下载文件download属性失效问题
- STM32红外遥控实验(发射器和接收器)
- 二维码扫描自定义规则思路