新手入门
- 积分
- 3
- 金钱
- 3
- 注册时间
- 2021-4-16
- 在线时间
- 0 小时
|
1金钱
#include "sys.h"
#include "delay.h"
#include "usart.h"
u8 rdata[1];
UART_HandleTypeDef usart1_handle;
//步骤1:调用此函数对串口进行初始化,此函数会调用下面的Msp函数
void uart1_init()
{ usart1_handle.Instance=USART1;
usart1_handle.Init.BaudRate=115200; //定义波特率
usart1_handle.Init.WordLength=UART_WORDLENGTH_8B; //数据位为8位
usart1_handle.Init.StopBits=UART_STOPBITS_1; //停止位为1位
usart1_handle.Init.HwFlowCtl=UART_HWCONTROL_NONE; //无硬件流控
usart1_handle.Init.Mode=UART_MODE_TX_RX; //模式为收发模式
usart1_handle.Init.Parity=UART_PARITY_NONE; //没有奇偶校验位
HAL_UART_Init(&usart1_handle); //HAL_UART_Init()使能UART1
}
//源文件中定义了此函数的弱函数,此处需要重新定义,此函数在HAL_UART_Init()中调用
void HAL_USART_MspInit(USART_HandleTypeDef *huart)
{
GPIO_InitTypeDef GPIO_Initure;
//首先判断是哪一个串口
if(huart->Instance==USART1)
{
//步骤2:时钟使能,串口相关IO口配置,复用配置
__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟
__HAL_RCC_USART1_CLK_ENABLE(); //使能USART1时钟
GPIO_Initure.Pin=GPIO_PIN_9; //A9
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
GPIO_Initure.Alternate=GPIO_AF7_USART1; //复用为USART1
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //HAL_GPIO_Init()函数配置A9
GPIO_Initure.Pin=GPIO_PIN_10;
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //HAL_GPIO_Init()函数配置A10
//步骤3:串口接收中断优先级配置和使能
HAL_NVIC_SetPriority(USART1_IRQn,3,3); //抢占和响应都设置3,可设0~3,数越小优先级越大,前抢占,后响应
HAL_NVIC_EnableIRQ(USART1_IRQn); //使能中断通道
}
}
//中断服务函数
void USART1_IRQHandler(void)
{
HAL_UART_IRQHandler(&usart1_handle);//执行完此函数会自动关闭中断,因此下一行代码开启接收中断
HAL_UART_Receive_IT(&usart1_handle,rdata,sizeof(rdata));
}
//编写接收中断回调函数,HAL_UART_IRQHandler()count位为0时执行此函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) //court位为0时执行此函数,此程序设置为1,实现单个数据执行一次中断
{
u8 rec;
if(huart->Instance==USART1)
{rec=*((huart->pRxBuffPtr)-1);
//或rec=rdata[0];
HAL_UART_Transmit(&usart1_handle,&rec,1,1000 ); //发送数据
}
}
int main(void)
{
HAL_Init();
Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
delay_init(180);
//调用此函数完成步骤1、2、3
uart1_init();
//步骤4:使能接收中断
HAL_UART_Receive_IT(&usart1_handle,rdata,sizeof(rdata)); //使能串口接收中断
while(1)
{
//等待接收中断指令,
// HAL_UART_Transmit(&usart1_handle,buff,sizeof(buff),1000 );
//
// delay_ms(300);
}
}
|
|