xzy610030

一起探讨,一起进步,一起分享!

stm32F4----串口通信(五)

0
阅读(3182)

过完年了,接着弄stm32了,接下来先试试串口通信了。

STM32F412 Nucleo-144基本上没有什么外设,要实现串口通信,必须有ttl转usb的东西。但是我懒得去买,买的话要等好几天,想了个办法,用fpga来转一下,我还是很聪明的。。。

fpga实现两个串口,一个和pc通信,一个和stm32通信,当从pc机那里接收到数据就发送给stm32,当从stm32接收到数据时就发送给pc机,这样就实现了一个回环。

部分代码:

uart       uart_pc_init

(

    .clk         (clk),

.rst_n       (rst_n),

.rxd         (rxd), 

.txd         (txd),

.rx_data     (rx_data),

.rx_int      (rx_int),

.tx_en       (tx_en),

.tx_data     (tx_data)

);


uart       uart_stm32_init

(

    .clk         (clk),

.rst_n       (rst_n),

.rxd         (rxd1), 

.txd         (txd1),

.rx_data     (tx_data),

.rx_int      (tx_en),

.tx_en       (rx_int),

.tx_data     (rx_data)

);


FPGA这部分弄起来很简单,毕竟都是以前弄过的东西~


接下来就是要学习stm32的串口部分了,在搞28335的时候,要实现串口通信,需要进行中断的使能和串口的初始化。首先看看板块引出的是哪个串口,使用的是USART2

1.png


,定义参数

//uart2

#define DEBUG_USART USART2

#define DEBUG_USART_CLK RCC_APB1Periph_USART2

#define DEBUG_USART_BAUDRATE 9600

//RX-----PD6

#define DEBUG_USART_RX_GPIO_PORT GPIOD

#define DEBUG_USART_RX_GPIO_CLK RCC_AHB1Periph_GPIOD

#define DEBUG_USART_RX_PIN GPIO_Pin_6

#define DEBUG_USART_RX_AF GPIO_AF_USART2

#define DEBUG_USART_RX_SOURCE GPIO_PinSource6


#define DEBUG_USART_TX_GPIO_PORT GPIOD

#define DEBUG_USART_TX_GPIO_CLK RCC_AHB1Periph_GPIOD

#define DEBUG_USART_TX_PIN GPIO_Pin_5

#define DEBUG_USART_TX_AF GPIO_AF_USART2

#define DEBUG_USART_TX_SOURCE GPIO_PinSource5


#define DEBUG_USART_IRQHandler USART2_IRQHandler

#define DEBUG_USART_IRQ USART2_IRQn 



总结来说,就是首要要知道使用的的是第几个串口,串口的时钟,串口的IO复用问题

初始化包括:GPIO和串口时钟,将引脚设置串口的模式(而不是普通的IO),串口的参数(波特率等等),中断设置及使能等。

编写中断配置函数

static void NVIC_Configuration(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;

 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

 NVIC_Init(&NVIC_InitStructure);

 }

 

编写串口配置函数

void Debug_USART_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

RCC_AHB1PeriphClockCmd(DEBUG_USART_RX_GPIO_CLK |

DEBUG_USART_TX_GPIO_CLK,

ENABLE);

 RCC_APB1PeriphClockCmd(DEBUG_USART_CLK, ENABLE);

 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

 GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_PIN ;

 GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

 GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_PIN;

 GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);


 GPIO_PinAFConfig(DEBUG_USART_RX_GPIO_PORT,

 DEBUG_USART_RX_SOURCE,

 DEBUG_USART_RX_AF);


 GPIO_PinAFConfig(DEBUG_USART_TX_GPIO_PORT,DEBUG_USART_TX_SOURCE,DEBUG_USART_TX_AF);

 USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;

 USART_InitStructure.USART_WordLength = USART_WordLength_8b;

 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(DEBUG_USART, &USART_InitStructure);

 NVIC_Configuration();

USART_ITConfig(DEBUG_USART, USART_IT_RXNE, ENABLE);

 USART_Cmd(DEBUG_USART, ENABLE);

 }


测试结果

1.png

对于用stm32的库,还是有些不习惯,相信后面用起来更加顺手,也会越来越感受到他的强大。