我是靠谱客的博主 腼腆悟空,最近开发中收集的这篇文章主要介绍linux下串口调用m0,Cortex-M0系列 ~ 串口配置,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

串口的相关概念自行百度理解,在上节的红外载波调制已经介绍过I/O的复用功能,使能I/O时钟,同时把GPIO模式设置为复用功能对应的模式,使能引脚复用,串口配置在此基础上对串口参数做初始化配置,包括比特率、停止位等参数,设置完接下来就是使能串口,同时如果开启了串口中断,还需要初始化NVIC设置中断优先级别,最后编写中断服务函数。

串口配置

void USART1_Init()

{

//Structure Init

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStruct;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //使能GPIOA的时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //使能USART的时钟

/* USART1的端口配置 */

GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1); //配置PA9成第二功能引脚 TX

GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1); //配置PA10成第二功能引脚 RX

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //GPIO模式为复用功能

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/* USART1的基本配置 */

USART_InitStructure.USART_BaudRate = USART1_BaudRate; //波特率,可以定义成宏或者是做传参给到,记得跟串口接收端统一波特率

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); //使能USART1

/* USART1的NVIC配置 */

NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStruct.NVIC_IRQChannelPriority = 0x02;

NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStruct); //中断优先级初始化

}

在这需要注意一点,如果是初次接触串口配置的新手,在初始化函数中使能过串口中断的话,一定要编写串口中断服务函数,不然虽然程序可以编译过去,但是运行代码的时候会跑到堆栈里面去然后跑死,而且芯片也不能再烧录程序,把MCU吹下来再换个新的才能继续烧录,在下第一次烧坏MCU后,排查代码串口初始化配置,还有硬件方面,都没配置错,直到连续烧了7片MCU接近奔溃把中断服务函数补回去试过后才不会跑死。因为也是第一次使用M0,而且我串口只需要做数据发送,不需要做接收处理,所以没写串口中断服务函数,只能因为一条使能串口中断。希望初学者不用犯同样的错误。

下面是串口中断服务函数

USART1_IRQHandler函数

void USART1_IRQHandler(void) 函数是串口1的中断响应函数,当串口1发生了相应的中断后就会跳转到该函数执行。中断响应函数的名字是不能随便定义的,一般都遵循MDK定义的函数名。这些函数名字在启动文件 startup_stm32f030.s 文件中可以找到。

函数体里面通过函数:

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

判断是否接收中断,如果是串口接收中断,则读取串口接收到的数据:

Res = USART_ReceiveData(USART1); // (USART1->DR) //读取接收到的数据

读到数据后接下来就对数据进行分析,大概理解到这就行了,接着是中断服务函数~

void USART1_IRQHandler(void)

{

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){}

}

用不到接收中断的话 if() 里面留空就行了,方便后面需要用到接收中断。

串口数据发送

可以在 stm32f0xx_usart.c 文件中看到函数定义:

/**

*@brief Transmits single data through the USARTx peripheral.

*@param USARTx: where x can be from 1 to 8 to select the USART peripheral.

*@note USART3 and USART4 are available only for STM32F072 and STM32F091 devices.

*@note USART5, USART6, USART7 and USART8 are available only for STM32F091 devices.

*@note USART2 is not available for STM32F031 devices.

*@param Data: the data to transmit.

*@retval None

*/

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)

{

/* Check the parameters */

assert_param(IS_USART_ALL_PERIPH(USARTx));

assert_param(IS_USART_DATA(Data));

/* Transmit Data */

USARTx->TDR = (Data & (uint16_t)0x01FF);

}

参数为串口名,需要传输的数据,直接调用

USART_SendData(USART1,(uint16_t)keyStatus);

因为怕数据转换发送错误,我在前面加了强制16位转换,看USART_SendDat函数定义就清楚了。

最后

以上就是腼腆悟空为你收集整理的linux下串口调用m0,Cortex-M0系列 ~ 串口配置的全部内容,希望文章能够帮你解决linux下串口调用m0,Cortex-M0系列 ~ 串口配置所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部