[MM32生态] 灵动微电子MM32F5330测评+串口通讯

[复制链接]
2878|2
 楼主| xiaoqi976633690 发表于 2024-6-22 09:47 | 显示全部楼层 |阅读模式
本帖最后由 xiaoqi976633690 于 2024-7-6 16:57 编辑

灵动微电子MM32F5330测评+板载串口通讯
一、实验目的
通过板载串口CH340和单片机串口(PA9,PA10)通讯。
原理图:
01.png

通过原理图可以看到C340与单片机连接关系为:RX--->PA9(TX),TX---->PA10(RX)

一、代码实现

初始化串口步骤
1.定义初始化结构体
  1. GPIO_InitTypeDef GPIO_InitStruct;
  2.     NVIC_InitTypeDef NVIC_InitStruct;
  3.     UART_InitTypeDef UART_InitStruct;
定义GPIO,NVIC,UART的结构体一边后面初始化使用

2.初始化串口模式
  1. RCC_APB1PeriphClockCmd(RCC_APB2Periph_UART1, ENABLE);

  2.     UART_StructInit(&UART_InitStruct);
  3.     UART_InitStruct.BaudRate      = Baudrate;
  4.     UART_InitStruct.WordLength    = UART_WordLength_8b;
  5.     UART_InitStruct.StopBits      = UART_StopBits_1;
  6.     UART_InitStruct.Parity        = UART_Parity_No;
  7.     UART_InitStruct.HWFlowControl = UART_HWFlowControl_None;
  8.     UART_InitStruct.Mode          = UART_Mode_Rx | UART_Mode_Tx;
  9.     UART_Init(UART1, &UART_InitStruct);


初始化串口模式首先是开启串口时钟,串口结构体初始化,接下来就是波特率,数据位长度,停止位,串口校验位,串口硬件流控制,串口txrx开启模式,最后使用
UART_Init(UART1, &UART_InitStruct);函数初始化完成。


3.初始化GPIO
  1. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

  2.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_7);
  3.                 GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_7);

  4.     GPIO_StructInit(&GPIO_InitStruct);
  5.     GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_9|GPIO_Pin_10;
  6.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
  7.     GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF_PP;
  8.     GPIO_Init(GPIOA, &GPIO_InitStruct);


GPIO初始化首先是开启gpio对应的时钟,GPIO 复用功能配置,接下来初始化GPIO结构体,配置GPIO的pin,速率,gpio模式。最后使用GPIO_Init(GPIOA, &GPIO_InitStruct);初始化完成。


4.NVIC 初始化
  1. NVIC_InitStruct.NVIC_IRQChannel = UART1_IRQn;
  2.     NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
  3.     NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
  4.     NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  5.                 NVIC_Init(&NVIC_InitStruct);
NVIC中断向量初始化首先配置NVIC通道,抢占优先级,子优先级和通道使能,最后NVIC_Init(&NVIC_InitStruct);  初始化完成。

5.开启串口中断
  1. UART_ITConfig(UART1,UART_IT_RX, true);
  2.                 NVIC_EnableIRQ(UART1_IRQn);
  3.     UART_Cmd(UART1, ENABLE);
初始化完成后还需要开启串口中断位,NVIC中断号,最后使能串口。初始化完整代码
  1. void UART_Configure(uint32_t Baudrate)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStruct;
  4.     NVIC_InitTypeDef NVIC_InitStruct;
  5.     UART_InitTypeDef UART_InitStruct;

  6.     RCC_APB1PeriphClockCmd(RCC_APB2Periph_UART1, ENABLE);

  7.     UART_StructInit(&UART_InitStruct);
  8.     UART_InitStruct.BaudRate      = Baudrate;
  9.     UART_InitStruct.WordLength    = UART_WordLength_8b;
  10.     UART_InitStruct.StopBits      = UART_StopBits_1;
  11.     UART_InitStruct.Parity        = UART_Parity_No;
  12.     UART_InitStruct.HWFlowControl = UART_HWFlowControl_None;
  13.     UART_InitStruct.Mode          = UART_Mode_Rx | UART_Mode_Tx;
  14.     UART_Init(UART1, &UART_InitStruct);

  15.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

  16.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_7);
  17.                 GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_7);

  18.     GPIO_StructInit(&GPIO_InitStruct);
  19.     GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_9|GPIO_Pin_10;
  20.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
  21.     GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF_PP;
  22.     GPIO_Init(GPIOA, &GPIO_InitStruct);

  23.     NVIC_InitStruct.NVIC_IRQChannel = UART1_IRQn;
  24.     NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
  25.     NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
  26.     NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  27.                 NVIC_Init(&NVIC_InitStruct);
  28.                
  29.                 UART_ITConfig(UART1,UART_IT_RX, true);
  30.                 NVIC_EnableIRQ(UART1_IRQn);
  31.                
  32.     UART_Cmd(UART1, ENABLE);
  33. }

中断函数实现

1.中断函数
串口1 的中断函数入口名为
  1. UART1_IRQHandler
  1. void UART1_IRQHandler(void)
  2. {
  3.     uint8_t RxData = 0;
  4.                 static uint8_t i=0;
  5.     if (SET == UART_GetITStatus(UART1, UART_IT_RX))
  6.     {
  7.                                 
  8.         RxData = UART_ReceiveData(UART1);
  9.                                 if(RxData=='\n'||RxData=='\r') i=0;
  10.                                 RX_buff[i]=RxData;
  11.                                 i++;
  12.         UART_ClearITPendingBit(UART1, UART_IT_RX);
  13.     }
  14. }
当串口1进入中断后,首先判断是否是UART_IT_RX   中断,如果是就把数据读出到RxData 并判断是否是字符串最后这里用\n,\r来判断,将数据存入RX_buff,
最后清除接收标志。

main函数实现
代码
  1. uint8_t RX_buff[RX_buff_size]; //外部定义数组


  2. int main(void)
  3. {
  4.         uint32_t i=0;
  5.         //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  6.         PLATFORM_Init();
  7.         UART_Configure(115200);
  8.         memset(RX_buff, 0,RX_buff_size);

  9.     while (1)
  10.     {
  11.                         i++;
  12.                         PLATFORM_DelayMS(1);
  13.                         if (i>500)
  14.                         {
  15.                                 GPIO_WriteBit(GPIOB, GPIO_Pin_11, GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_11) ? Bit_RESET : Bit_SET);
  16.                                 i=0;
  17.                         }

  18.                         if(RX_buff[0]!=0)        
  19.                         {
  20.                           printf("%s\n\r",RX_buff);
  21.                                 memset(RX_buff, 0,RX_buff_size);
  22.                         }

  23.     }
  24. }

二、实验现象
02.png

二、结论
MM32F5333上手还是非常容易,只要有一点32位单片机基础就可以很快上手。
非常感谢论坛和灵动微的活动。


Bowclad 发表于 2024-6-27 18:20 | 显示全部楼层
能不能用来下载程序
gangong 发表于 2024-10-26 19:37 | 显示全部楼层
点点赞赞
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

205

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部