stm32F4----串口通信(五)
0赞过完年了,接着弄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
,定义参数
//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);
}
测试结果
对于用stm32的库,还是有些不习惯,相信后面用起来更加顺手,也会越来越感受到他的强大。