既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
1.库函数
usart.h
#ifndef \_\_USART\_H
#define \_\_USART\_H
#include "stm32f10x.h"
#include<stdio.h>
void MyUSART\_Init(void);
void Usart\_SendByte( USART_TypeDef \* pUSARTx, uint8\_t ch);
void Usart\_SendString( USART_TypeDef \* pUSARTx, char \*str);
#endif
usart.c
#include "usart.h"
//重定向C库函数printf到串口,重定向后可使用printf函数
int fputc(int ch,FILE \*f)
{
/\* 发送一个字节数据到串口 \*/
USART\_SendData(USART1,(uint8\_t) ch);
while(USART\_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
return (ch);
}
//重定向C库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE \*f)
{
/\* 等待串口输入数据 \*/
while(USART\_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
return (int)USART\_ReceiveData(USART1);
}
void MyUSART\_Init()
{
/\* 定义GPIO、NVIC和USART初始化的结构体 \*/
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;
/\* 使能GPIO和USART的时钟 \*/
RCC\_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC\_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
/\* 将USART TX(A9)的GPIO设置为推挽复用模式 \*/
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO\_Init(GPIOA,&GPIO_InitStructure);
/\* 将USART RX(A10)的GPIO设置为浮空输入模式 \*/
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO\_Init(GPIOA,&GPIO_InitStructure);
/\* 配置串口 \*/
USART_InitStructure.USART_BaudRate=115200; //波特率了设置为115200
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //不使用硬件流控制
USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx; //使能接收和发送
USART_InitStructure.USART_Parity=USART_Parity_No; //不使用奇偶校验位
USART_InitStructure.USART_StopBits=USART_StopBits_1; //1位停止位
USART_InitStructure.USART_WordLength=USART_WordLength_8b; //字长设置为8位
USART\_Init(USART1, &USART_InitStructure);
/\* Usart1 NVIC配置 \*/
NVIC\_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC\_Init(&NVIC_InitStructure);
/\*初始化串口,开启串口接收中断 \*/
USART\_ITConfig(USART1,USART_IT_RXNE,ENABLE);
/\* 使能串口1 \*/
USART\_Cmd(USART1,ENABLE);
}
/\* USART1中断函数 \*/
void USART1\_IRQHandler(void)
{
uint8\_t ucTemp; //接收数据
if(USART\_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
{
ucTemp = USART\_ReceiveData(USART1);
USART\_SendData(USART1,ucTemp);
}
}
/\* 发送一个字节 \*/
void Usart\_SendByte( USART_TypeDef \* pUSARTx, uint8\_t ch)
{
/\* 发送一个字节数据到USART \*/
USART\_SendData(pUSARTx,ch);
/\* 等待发送数据寄存器为空 \*/
while (USART\_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
}
/\* 发送字符串 \*/
void Usart\_SendString( USART_TypeDef \* pUSARTx, char \*str)
{
unsigned int k=0;
do
{
Usart\_SendByte( pUSARTx, \*(str + k) );
k++;
} while(\*(str + k)!='\0');
/\* 等待发送完成 \*/
while(USART\_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
{}
}
main.c
#include "stm32f10x.h"
#include "usart.h"
int main(void)
{
MyUSART\_Init();
while(1)
{}
}
2.HAL库函数
和之前一样,这里仅介绍不同的操作。首先配置串口1(USART1),将模式设置为异步,NVIC设置为Enabled。
然后设置中断分组
如果需要设置USART1的其它参数,可以在Parameter Settings中设置,笔者这里选择了默认设置
设置好后修改代码,和上面的库函数类似,主要是修改中断函数。首先在main.c中添加数组和相关参数的定义
char RxBuffer[256]; //接收数据
uint8\_t aRxBuffer; //接收中断缓冲
uint8\_t Uart1_Rx_Cnt = 0; //接收缓冲计数
然后在下面添加中断回调函数
void HAL\_UART\_RxCpltCallback(UART_HandleTypeDef \*huart)
{
/\* Prevent unused argument(s) compilation warning \*/
UNUSED(huart);
/\* NOTE: This function Should not be modified, when the callback is needed,
the HAL\_UART\_TxCpltCallback could be implemented in the user file
\*/
RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer; //接收数据转存
if((RxBuffer[Uart1_Rx_Cnt-1] == 0x0A)&&(RxBuffer[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位
{
HAL\_UART\_Transmit(&huart1, (uint8\_t \*)&RxBuffer, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去
while(HAL\_UART\_GetState(&huart1) == HAL_UART_STATE_BUSY_TX); //检测UART发送结束
Uart1_Rx_Cnt = 0;
memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组
}
HAL\_UART\_Receive\_IT(&huart1, (uint8\_t \*)&aRxBuffer, 1); //再开启接收中断
}
因为在stm32f1xx_hal_uart.c文件中,对于中断函数中的回调函数是弱定义,所以这里的函数定义覆盖了之前的定义。对于HAL库来说,提供了一系列的函数可以操作。如果需要使用printf等函数可以参考库函数的方法,重定向函数来实现。
三、实验结果
收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
链图片转存中…(img-EAJEFybr-1715633475746)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!