STM 32下シリアルポートの使用
STM 32のシリアルポートに関するファームウェアライブラリはかなりよく書かれていますが、以下は本明細書のシリアルポートライブラリのほんの少しのパッケージにすぎません.
/*HKY_uart.h*/
#ifndef _HKY_UART_H_
#define _HKY_UART_H_
#include "stm32f10x_lib.h"
//#include "platform_config.h"
#define GPIO_RTSPin GPIO_Pin_1
#define GPIO_CTSPin GPIO_Pin_0
#define GPIO_TxPin GPIO_Pin_2
#define GPIO_RxPin GPIO_Pin_3
void USART2_Configuration(void);
int USART_sendBuf(USART_TypeDef* USARTx, u8 *buf, u32 len);
int USART_recvBuf(USART_TypeDef* USARTx, u8 *buf, u32 len);
#endif //_HKY_UART_H_
/*HKY_uart.c*/
#include "HKY_uart.h"
/* --------------------------------------------------------------------------*/
/**
* @Brief: USART2_Configuration
*/
/* --------------------------------------------------------------------------*/
void USART2_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//IO port----------------------------------------------------------------------
/* Configure USART2 RTS and USART2 Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_TxPin;//GPIO_RTSPin | GPIO_TxPin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure USART2 CTS and USART2 Rx as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_RxPin;//GPIO_CTSPin | GPIO_RxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* USART2 configuration ------------------------------------------------------*/
/* USART2 configured as follow:
- BaudRate = 115200 baud
- Word Length = 8 Bits
- One Stop Bit
- No parity
- Hardware flow control enabled (RTS and CTS signals)
- Receive and transmit enabled
*/
USART_InitStructure.USART_BaudRate = 115200;
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_HardwareFlowControl_RTS_CTS;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART2, &USART_InitStructure);
/* Enable the USART2 */
USART_Cmd(USART2, ENABLE);
USART_ClearFlag(USART2, USART_FLAG_TC); // clear flag
}
/* --------------------------------------------------------------------------*/
/**
* @Brief: USART_sendBuf
*
* @Param: USARTx, which uart port
* @Param: buf, send buffer
* @Param: len, buffer length
*
* @Returns: send bytes count
*/
/* --------------------------------------------------------------------------*/
int USART_sendBuf(USART_TypeDef* USARTx, u8 *buf, u32 len)
{
u32 busy_cnt = 0;
u32 i = 0;
while (i < len)
{
USART_SendData(USARTx, buf[i++]);
busy_cnt = 0;
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET)
{
busy_cnt++;
if (busy_cnt > 0xffff)
return i; //send error, return sended bytes count
}
}
return len;
}
/* --------------------------------------------------------------------------*/
/**
* @Brief: USART_recvBuf
*
* @Param: USARTx, which uart port
* @Param: buf, receive buffer
* @Param: len, buffer length
*
* @Returns: received bytes count
*/
/* --------------------------------------------------------------------------*/
int USART_recvBuf(USART_TypeDef* USARTx, u8 *buf, u32 len)
{
u32 busy_cnt = 0;
u32 i = 0;
while (i < len)
{
if(USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) != RESET)
{
buf[i] = USART_ReceiveData(USARTx) & 0xff;
i++;
}
else
{
busy_cnt++;
}
if (busy_cnt > 0xffff)
return i; //receive error, return received bytes count
}
return len;
}