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函数定义就清楚了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32F030C8是一款由STMicroelectronics(意法半导体)公司生产的32位ARM Cortex-M0系列微控制器。它具有丰富的外设,包括多个通用输入/输出(GPIO)引脚、通用定时器、16KB闪存和4KB SRAM等。 串口是一种用于在微控制器与其他外部设备之间进行通信的接口。STM32F030C8内部集成了多个串口(USART),其中包括USART1、USART2和USART3。这些串口可以通过GPIO引脚进行配置和连接。通过使用STM32Cube软件库,我们可以轻松设置和配置串口功能。 为了使用串口功能,我们需要进行以下步骤: 1. 初始化串口:初始化所需的串口,指定波特率、奇偶校验位、停止位等参数。 2. 配置引脚:将串口引脚配置为相应的通信功能。在STM32F030C8上,我们可以使用不同的GPIO引脚作为串口的引脚,具体需要根据实际需求进行配置。 3. 发送数据:使用串口发送数据,可以通过调用相应的发送函数将数据发送到外部设备。 4. 接收数据:使用串口接收数据,可以通过调用相应的接收函数从外部设备读取接收到的数据。 串口通信可以用于各种应用场景,例如与计算机进行通信、与传感器连接、与其他微控制器进行数据交换等。通过使用STM32F030C8的串口功能,我们可以方便地实现这些应用,并进行双向的数据传输。 ### 回答2: STM32F030C8是意法半导体(STMicroelectronics)推出的一款32位微控制器,它具有高性能、低功耗和丰富的外设接口,适用于广泛的应用领域。其中,串口是常用的外设之一。 STM32F030C8内置了多个串口接口,包括USART1、USART2、USART3等。这些串口可以用于和外部设备进行通信,如传感器、显示器、蓝牙模块等。串口通信是一种通过发送和接收数据来实现设备间数据交换的通信方式。 在使用STM32F030C8的串口功能时,首先需要配置串口的工作模式、波特率和数据位数等参数。通过设置寄存器和相关的控制位来完成这些配置。之后,可以通过读写相应的寄存器来发送和接收数据。 通常情况下,发送数据时需要将待发送的数据写入数据寄存器,然后等待发送完成的标志位被置位。接收数据时,需要检测接收缓冲区是否有新的数据,若有则读取并处理。 此外,STM32F030C8的串口还支持多种通信协议,如UART、SPI和I2C等。可以根据具体需求选择相应的协议。 总之,STM32F030C8的串口功能具有灵活性和可扩展性,可以实现与外部设备的高效通信,为嵌入式系统提供了强大的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值