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

一、实验目的
通过板载串口CH340和单片机串口(PA9,PA10)通讯。
原理图:
 



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

一、代码实现

初始化串口步骤
1.定义初始化结构体

复制
 GPIO_InitTypeDef GPIO_InitStruct;

    NVIC_InitTypeDef NVIC_InitStruct;

    UART_InitTypeDef UART_InitStruct;

定义GPIO,NVIC,UART的结构体一边后面初始化使用

2.初始化串口模式

复制
RCC_APB1PeriphClockCmd(RCC_APB2Periph_UART1, ENABLE);



    UART_StructInit(&UART_InitStruct);

    UART_InitStruct.BaudRate      = Baudrate;

    UART_InitStruct.WordLength    = UART_WordLength_8b;

    UART_InitStruct.StopBits      = UART_StopBits_1;

    UART_InitStruct.Parity        = UART_Parity_No;

    UART_InitStruct.HWFlowControl = UART_HWFlowControl_None;

    UART_InitStruct.Mode          = UART_Mode_Rx | UART_Mode_Tx;

    UART_Init(UART1, &UART_InitStruct);



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


3.初始化GPIO

复制
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);



    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_7);

                GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_7);



    GPIO_StructInit(&GPIO_InitStruct);

    GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_9|GPIO_Pin_10;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;

    GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF_PP;

    GPIO_Init(GPIOA, &GPIO_InitStruct);



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


4.NVIC 初始化

复制
 NVIC_InitStruct.NVIC_IRQChannel = UART1_IRQn;

    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;

    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

                NVIC_Init(&NVIC_InitStruct);

NVIC中断向量初始化首先配置NVIC通道,抢占优先级,子优先级和通道使能,最后NVIC_Init(&NVIC_InitStruct);  初始化完成。

5.开启串口中断

复制
UART_ITConfig(UART1,UART_IT_RX, true);

                NVIC_EnableIRQ(UART1_IRQn);

    UART_Cmd(UART1, ENABLE);

初始化完成后还需要开启串口中断位,NVIC中断号,最后使能串口。初始化完整代码

复制
void UART_Configure(uint32_t Baudrate)

{

    GPIO_InitTypeDef GPIO_InitStruct;

    NVIC_InitTypeDef NVIC_InitStruct;

    UART_InitTypeDef UART_InitStruct;



    RCC_APB1PeriphClockCmd(RCC_APB2Periph_UART1, ENABLE);



    UART_StructInit(&UART_InitStruct);

    UART_InitStruct.BaudRate      = Baudrate;

    UART_InitStruct.WordLength    = UART_WordLength_8b;

    UART_InitStruct.StopBits      = UART_StopBits_1;

    UART_InitStruct.Parity        = UART_Parity_No;

    UART_InitStruct.HWFlowControl = UART_HWFlowControl_None;

    UART_InitStruct.Mode          = UART_Mode_Rx | UART_Mode_Tx;

    UART_Init(UART1, &UART_InitStruct);



    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);



    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_7);

                GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_7);



    GPIO_StructInit(&GPIO_InitStruct);

    GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_9|GPIO_Pin_10;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;

    GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF_PP;

    GPIO_Init(GPIOA, &GPIO_InitStruct);



    NVIC_InitStruct.NVIC_IRQChannel = UART1_IRQn;

    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;

    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

                NVIC_Init(&NVIC_InitStruct);

                

                UART_ITConfig(UART1,UART_IT_RX, true);

                NVIC_EnableIRQ(UART1_IRQn);

                

    UART_Cmd(UART1, ENABLE);

}


中断函数实现

1.中断函数
串口1 的中断函数入口名为

复制
UART1_IRQHandler
复制
void UART1_IRQHandler(void)

{

    uint8_t RxData = 0;

                static uint8_t i=0;

    if (SET == UART_GetITStatus(UART1, UART_IT_RX))

    {

                                

        RxData = UART_ReceiveData(UART1);

                                if(RxData=='\n'||RxData=='\r') i=0;

                                RX_buff[i]=RxData;

                                i++;

        UART_ClearITPendingBit(UART1, UART_IT_RX);

    }

}

当串口1进入中断后,首先判断是否是UART_IT_RX   中断,如果是就把数据读出到RxData 并判断是否是字符串最后这里用\n,\r来判断,将数据存入RX_buff,
最后清除接收标志。

main函数实现
代码

复制
uint8_t RX_buff[RX_buff_size]; //外部定义数组





int main(void)

{

        uint32_t i=0;

        //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

        PLATFORM_Init();

        UART_Configure(115200);

        memset(RX_buff, 0,RX_buff_size);



    while (1)

    {

                        i++;

                        PLATFORM_DelayMS(1);

                        if (i>500)

                        {

                                GPIO_WriteBit(GPIOB, GPIO_Pin_11, GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_11) ? Bit_RESET : Bit_SET);

                                i=0;

                        }



                        if(RX_buff[0]!=0)        

                        {

                          printf("%s\n\r",RX_buff);

                                memset(RX_buff, 0,RX_buff_size);

                        }



    }

}


二、实验现象
 



二、结论
MM32F5333上手还是非常容易,只要有一点32位单片机基础就可以很快上手。
非常感谢论坛和灵动微的活动。
---------------------
作者:xiaoqi976633690
链接:https://bbs.21ic.com/icview-3384934-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值