新手小白学习使用stm32笔记,用的f103c8t6
1.首先配置,选择芯片,系统调试
选择STLINK调试(Serial Wire)
2.RCC
高速时钟源选择外部晶振 (Crystal/Ceramic Resonator)
3.配置时钟树
选择外部晶振8MHz,倍频为9,出来应该是8*9=72MHz,此处为PLL锁相环
选择系统时钟来源为PLLCLK,设置APB1分频器为/2
4,串口配置
点击Connectivity,设置串口1,选择模式MODE为异步通讯(Asynchronous)
选择串口波特率为115200 Bits/s(此处分频大约为8.68us),传输数据长度为8Bits,停止位1。
5,生成工程
其中选择每个外设都生成独立的.c.h文件
代码生成后,我直接在while里面调用了printf函数发现串口接收不到数据,后面上网了解后发现hal中的printf函数需要用户自行重定义
6.在usart.c中加入如下代码
/***************** 串口重定向 **********************/
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
int fgetc(FILE * f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1,&ch, 1, 0xffff);
return ch;
}
加入之后我的代码报错了,说我的FILE没有进行声明,后面经过学习发现FILE定义在stdio.h文件里面
7.在usart.h文件里面包含stdio.h
#include "stdio.h"
代码运行了,但是串口软件还是没有接收到单片机发出的数据,进行代码调试会卡死,原因是漏了在KEIL中设置的一步
8.在魔术棒中把Use MicroLIB选项勾上
总结
这是我用串口进行数据反馈的一个小功能,HAL中串口还有一些中断回调函数的使用我没用上
发现了一些串口回调函数
//串口发送中断回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
//串口接收中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
还有串口回调函数的使用方法
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
HAL_UART_Transmit(&huart1, uart1_rxbuf, 10, 100); // 把收到的字节原样发送出去
HAL_UART_Receive_IT(&huart1, uart1_rxbuf, 10);
}
else if(huart->Instance == USART2)
{
HAL_UART_Transmit(&huart2, uart2_rxbuf, 10, 100); // 把收到的字节原样发送出去
HAL_UART_Receive_IT(&huart2, uart2_rxbuf, 10);
}
}
此处借鉴文章链接:stm32cubemx 串口(详细)_等不到星光等时光呀的博客-优快云博客_stm32cubemx 串口