xzy610030

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

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

0
阅读(3136)

过完年了,接着弄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的库,还是有些不习惯,相信后面用起来更加顺手,也会越来越感受到他的强大。


Baidu
map