本文介绍: 要注意,这个是直接打在屏幕上,而我们现在是要把可执行文件烧写到开发板上,通过开发板串口和PC连接后发送和接收数据,不是一个层面的事情。到现在为止都是在开发板上运行的裸机程序,相当于之前学习STM32单片机时走过的路,还没有真正进入到核心的驱动开发部分,但这都是基础,所以慢慢来不着急。I.MX6UL的串口操作大同小异,和之前的GPIO类似,也是需要第三方编写函数操作各个串口相关的寄存器来达到想要的功能文件夹,再使用正点原子写好的相关驱动,直接放到工程文件夹里,就可以使用串口进行数据读写了。

到现在为止都是在开发板上运行的裸机程序,相当于之前学习STM32单片机时走过的路,还没有真正进入到核心的驱动开发部分,但这都是基础,所以慢慢来不着急。
接下来进入串口通信学习,和GPIO一样,也是和单片机对比着来看。
先看下使用CubeMX设置初始化串口后自动生成代码,应该都很熟悉了。

void MX_USART1_UART_Init(void)
{
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
}

void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(uartHandle->Instance==USART1)
  {
    __HAL_RCC_USART1_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**USART1 GPIO Configuration
    PA8     ------> USART1_CK
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_8|USART1_TX_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = USART1_RX_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(USART1_RX_GPIO_Port, &GPIO_InitStruct);

    /* USART1 interrupt Init */
    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART1_IRQn);
  }
}

使用串口收发数据时使用的函数是HAL_UART_Transmit()HAL_UART_Receive()或者HAL_UART_Receive_IT()等,或者直接改写printf()scanf()来直接打印或接收串口数据
I.MX6UL的串口操作大同小异,和之前的GPIO类似,也是需要第三方编写函数来操作各个串口相关的寄存器来达到想要的功能。有以下4步:

  1. 设置UART的时钟源,设置寄存器CCM_CSCDR1
  2. 初始化UART,包括波特率,奇偶校验位、停止位、数据位,设置寄存器UART1_UCR1~UCR3
  3. 使能相应的UART,设置寄存器UART1_UCR1
  4. 编写UART的数据收发函数,操作寄存器UART1_UTXD

但其实想想就知道,编写收发函数的这种串口读写方法太繁琐了,最开始helloworld的时候不是直接可以printf("Hello World!n");吗?要注意,这个是直接打在屏幕上,而我们现在是要把可执行文件烧写到开发板上,通过开发板的串口和PC连接后发送和接收数据,不是一个层面的事情。当然,我们还是可以printf()scanf(),但是一定需要初始化串口。本人最主要是想学习Linux的应用,比较浮躁,不愿意投入时间精力去看寄存器的操作,所以在这一阶段利用Uboot移植的stdio文件夹,再使用正点原子写好的相关驱动,直接放到工程文件夹里,就可以使用串口进行数据读写了。
main.c里加入这段

char a[20];
int b;
printf("please input your name and your age, use space between them:");
scanf("%s %d, &a, &b);
printf("rn%s is the most handsome one in the age of %d", a, b);

编译链接烧写后通过MobaXTerm或其他工具即可完成串口数据测试可以打印并接收,完成了预想的功能

(未完待续)

原文地址:https://blog.csdn.net/raulcy/article/details/134580401

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_2351.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注