这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【转载】STM32F407和K230串口通信--from毅

共1条 1/1 1 跳转至

【转载】STM32F407和K230串口通信--from毅

工程师
2025-10-20 23:23:20     打赏

STM32F407串口配置:配置串口PA9/PA10


void uart_init(u32 bound){

   //GPIO端口设置

  GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟

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

 

//串口1对应引脚复用映射

GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1

GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1

//USART1端口配置

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉

GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10

 

   //USART1 初始化设置

USART_InitStructure.USART_BaudRate = bound;//波特率设置

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); //初始化串口1

  USART_Cmd(USART1, ENABLE);  //使能串口1 

//USART_ClearFlag(USART1, USART_FLAG_TC);

#if EN_USART1_RX

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断

 

//Usart1 NVIC 配置

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3

NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3

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

NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、

 

#endif

}

 

 

void USART1_IRQHandler(void)                //串口1中断服务程序

{

u8 Res;

#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.

OSIntEnter();    

#endif

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)

{

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

if((USART_RX_STA&0x8000)==0)//接收未完成

{

if(USART_RX_STA&0x4000)//接收到了0x0d

{

if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始

else USART_RX_STA|=0x8000; //接收完成了 

}

else //还没收到0X0D

{

if(Res==0x0d)USART_RX_STA|=0x4000;

else

{

USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;

USART_RX_STA++;

if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收   

}  

}

}     

  } 


主函数:接收K230发送的数据并做应答:接收K230发送的一个数组,并且闪烁LED


#include "sys.h"

#include "usart.h"

#include "delay.h"

#include "led.h"

#include "oled.h"

#include "string.h"

 

extern uint8_t USART_RX_BUF[USART_REC_LEN];

extern uint16_t USART_RX_STA;

char displayStr[32];

uint16_t i,len;

 

void Send_To_K230(uint8_t *data, uint16_t len) {

    for( i = 0; i < len; i++) {

        USART_SendData(USART1, data[i]);

        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

    }

}

 

int main(void) {

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    delay_init(168);

    uart_init(115200);

    LED_Init();

    OLED_Init();

    OLED_Clear();

    OLED_ShowString(0, 0, "UART Receiver", 16);

    OLED_ShowString(0, 16, "Waiting...", 16);

    OLED_Refresh_Gram();

    while(1) {

        if(USART_RX_STA & 0x8000) {

             len = USART_RX_STA & 0x3FFF;

            // 检查是否收到特定数组 [25,10,10]

            if(len >= 3 && 

               USART_RX_BUF[0] == 25 && 

               USART_RX_BUF[1] == 10 && 

               USART_RX_BUF[2] == 10) {

                

                LED0 = !LED0; // 翻转LED

                

                // 在OLED上显示接收到的数组

               

                sprintf(displayStr, "RX: %d,%d,%d", 

                        USART_RX_BUF[0], 

                        USART_RX_BUF[1], 

                        USART_RX_BUF[2]);

                OLED_ShowString(0, 16, displayStr, 16);

                

                // 发送确认信息回K230

                Send_To_K230((uint8_t*)"ACK: Array Received\r\n", 22);

                

                // 在OLED上显示已响应

                OLED_ShowString(0, 32, "Sent ACK to K230", 16);

            } else {

                // 显示接收到的原始数据

                char infoStr[32];

                sprintf(infoStr, "RX Len: %d", len);

                OLED_ShowString(0, 16, infoStr, 16);

                

                // 显示前3个字节

                if(len > 0) {

                    sprintf(infoStr, "Data: %d,%d,%d", 

                            USART_RX_BUF[0], 

                            len > 1 ? USART_RX_BUF[1] : 0, 

                            len > 2 ? USART_RX_BUF[2] : 0);

                    OLED_ShowString(0, 32, infoStr, 16);

                }

            }

            

            OLED_Refresh_Gram();

            USART_RX_STA = 0;  // 清除接收标志

        }

        delay_ms(10);

    }

}


K230的配置就较为简单了,这里直接给出代码,可根据自己需求更改。


from machine import UART

from machine import FPIOA

import time

import machine

fpioa = FPIOA()

fpioa.set_function(11, FPIOA.UART2_TXD)

fpioa.set_function(12, FPIOA.UART2_RXD)

uart = UART(UART.UART2, 115200)  # 设置串口号2和波特率

data_array = [25,10,10]  # ASCII: H e l l o

while True:

    uart.write(bytes(data_array))  # 将列表转为字节对象发送

    uart.write('\r\n')  # 添加换行便于观察

    text = uart.read(128)  # 接收128个字符

    if text != None:

        print(text)  # 通过REPL打印串口接收的数据

    time.sleep(0.1)  # 100ms

K230把数组data_array发送给32F407,32接收到数组后闪烁LED并发送"   Array Received "表明接收成功。

1741d55c8e9246629ba0bfa500d4c47b.png

STM32识别为特定命令

当STM32检测到此数组时:

翻转LED状态

OLED显示接收到的数组值

向K230发送确认信息 "ACK: Array Received"

OLED显示"Sent ACK to K230"

对于其他数据:

显示接收数据长度

显示前3个字节的十进制值

K230和STM32就能通过字节数组进行通信了,K230发送的 bytes([25,10,10]) 会被STM32识别并响应。

来源: 整理文章为传播相关技术,网络版权归原作者所有,如有侵权,请联系删除。




共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]