stm32串口c语言程序,STM32 库函数处理 串口的例程

http://tedeum.iteye.com/blog/2017365

stm32使用库函数编写USART还是很方便的,现在转几个例子:

Cpp代码  04a6b793d7c20d23c04a42e8a6fdea5a.png

/***************************************

转载请注明出处:tedeum.iteye.com

****************************************/

首先是不使用中断的方法使用usart1,管脚pa9,pa10,此方法已在f3discovery上验证通过,来源:https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2Fusart%20code&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&currentviews=524

C代码  04a6b793d7c20d23c04a42e8a6fdea5a.png

// STM32 USART1 (Tx PA.9, Rx PA.10) STM32F3-Discovery - sourcer32@gmail.com

#include "stm32f30x.h"

/**************************************************************************************/

void RCC_Configuration(void)

{

/* Enable GPIO clock */

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

/* Enable USART clock */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

}

/**************************************************************************************/

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

/* Connect PA9 to USART1_Tx */

GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_7);

/* Connect PA10 to USART1_Rx */

GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_7);

/* Configure USART Tx as alternate function push-pull */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure USART Rx as alternate function push-pull */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_Init(GPIOA, &GPIO_InitStructure);

}

/**************************************************************************************/

void USART1_Configuration(void)

{

USART_InitTypeDef USART_InitStructure;

/* USART resources configuration (Clock, GPIO pins and USART registers) ----*/

/* USART configured as follow:

- BaudRate = 115200 baud

- Word Length = 8 Bits

- One Stop Bit

- No parity

- Hardware flow control disabled (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_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

/* USART configuration */

USART_Init(USART1, &USART_InitStructure);

/* Enable USART */

USART_Cmd(USART1, ENABLE);

}

/**************************************************************************************/

int main(void)

{

RCC_Configuration();

GPIO_Configuration();

USART1_Configuration();

while(1)

{

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); // Wait for Empty

USART_SendData(USART1, 0x49); // Send 'I'

}

while(1); // Don't want to exit

}

/**************************************************************************************/

#ifdef  USE_FULL_ASSERT

/**

* @brief  Reports the name of the source file and the source line number

*         where the assert_param error has occurred.

* @param  file: pointer to the source file name

* @param  line: assert_param error line source number

* @retval None

*/

void assert_failed(uint8_t* file, uint32_t line)

{

/* User can add his own implementation to report the file name and line number,

ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

/* Infinite loop */

while (1)

{

}

}

#endif

接下来是使用中断的方法,使用USART3,管脚pd8,pd9,来源:https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/STM32F4%20USART%20receive%20problem&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&currentviews=124

C代码  04a6b793d7c20d23c04a42e8a6fdea5a.png

// STM32 USART IRQ TX/RX Loop (USART3 Tx PD.8, Rx PD.9) STM32F4 Discovery - sourcer32@gmail.com

#include "stm32f4_discovery.h"

volatile char StringLoop[] = "The quick brown fox jumps over the lazy dog\r\n";

/**************************************************************************************/

void RCC_Configuration(void)

{

/* --------------------------- System Clocks Configuration -----------------*/

/* USART3 clock enable */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

/* GPIOD clock enable */

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

}

/**************************************************************************************/

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

/*-------------------------- GPIO Configuration ----------------------------*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOD, &GPIO_InitStructure);

/* Connect USART pins to AF */

GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_USART3);

GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_USART3);

}

/**************************************************************************************/

void USART3_Configuration(void)

{

USART_InitTypeDef USART_InitStructure;

/* USARTx configuration ------------------------------------------------------*/

/* USARTx configured as follow:

- BaudRate = 9600 baud

- Word Length = 8 Bits

- One Stop Bit

- No parity

- Hardware flow control disabled (RTS and CTS signals)

- Receive and transmit enabled

*/

USART_InitStructure.USART_BaudRate = 9600;

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

USART_Cmd(USART3, ENABLE);

USART_ITConfig(USART3, USART_IT_TXE, ENABLE);

USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);

}

/**************************************************************************************/

void NVIC_Configuration(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

/* Configure the NVIC Preemption Priority Bits */

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

/* Enable the USART3 Interrupt */

NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

/**************************************************************************************/

void USART3_IRQHandler(void)

{

static int tx_index = 0;

static int rx_index = 0;

if (USART_GetITStatus(USART3, USART_IT_TXE) != RESET) // Transmit the string in a loop

{

USART_SendData(USART3, StringLoop[tx_index++]);

if (tx_index >= (sizeof(StringLoop) - 1))

tx_index = 0;

}

if (USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) // Received characters modify string

{

StringLoop[rx_index++] = USART_ReceiveData(USART3);

if (rx_index >= (sizeof(StringLoop) - 1))

rx_index = 0;

}

}

/**************************************************************************************/

int main(void)

{

RCC_Configuration();

GPIO_Configuration();

NVIC_Configuration();

USART3_Configuration();

while(1); // Don't want to exit

}

/**************************************************************************************/

最后,是使用DMA的方法,使用usart5,管脚:pc12,pd2,来源:https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/DMA%20Memory%20To%20UART5&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&currentviews=760

C代码  04a6b793d7c20d23c04a42e8a6fdea5a.png

// STM32 UART5 DMA TX (Tx PC.12, Rx PD.2) STM32F4 Discovery - sourcer32@gmail.com

#include "stm32f4_discovery.h"

/**************************************************************************************/

void RCC_Configuration(void)

{

/* --------------------------- System Clocks Configuration -----------------*/

/* UART5 clock enable */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);

/* GPIOC and GPIOD clock enable */

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD, ENABLE);

/* DMA1 clock enable */

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);

}

/**************************************************************************************/

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

/*-------------------------- GPIO Configuration ----------------------------*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // PC.12 UART5_TX, potential clash SDIN CS43L22

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; // PD.2 UART5_RX

GPIO_Init(GPIOD, &GPIO_InitStructure);

/* Connect USART pins to AF */

GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_UART5);

GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_UART5);

}

/**************************************************************************************/

void UART5_Configuration(void)

{

USART_InitTypeDef USART_InitStructure;

/* USARTx configuration ------------------------------------------------------*/

/* USARTx configured as follow:

- BaudRate = 115200 baud

- Word Length = 8 Bits

- One Stop Bit

- No parity

- Hardware flow control disabled (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_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_Init(UART5, &USART_InitStructure);

USART_Cmd(UART5, ENABLE);

}

/**************************************************************************************/

char Buffer[] = "The quick brown fox jumps over the lazy dog\r\n";

void DMA_Configuration(void)

{

DMA_InitTypeDef  DMA_InitStructure;

DMA_DeInit(DMA1_Stream7);

DMA_InitStructure.DMA_Channel = DMA_Channel_4;

DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; // Transmit

DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Buffer;

DMA_InitStructure.DMA_BufferSize = (uint16_t)sizeof(Buffer) - 1;

DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&UART5->DR;

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

DMA_InitStructure.DMA_Priority = DMA_Priority_High;

DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;

DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;

DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;

DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;

DMA_Init(DMA1_Stream7, &DMA_InitStructure);

/* Enable the USART Tx DMA request */

USART_DMACmd(UART5, USART_DMAReq_Tx, ENABLE);

/* Enable DMA Stream Transfer Complete interrupt */

DMA_ITConfig(DMA1_Stream7, DMA_IT_TC, ENABLE);

/* Enable the DMA RX Stream */

DMA_Cmd(DMA1_Stream7, ENABLE);

}

/**************************************************************************************/

void DMA1_Stream7_IRQHandler(void)

{

/* Test on DMA Stream Transfer Complete interrupt */

if (DMA_GetITStatus(DMA1_Stream7, DMA_IT_TCIF7))

{

/* Clear DMA Stream Transfer Complete interrupt pending bit */

DMA_ClearITPendingBit(DMA1_Stream7, DMA_IT_TCIF7);

}

}

/**************************************************************************************/

void NVIC_Configuration(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

/* Configure the Priority Group to 2 bits */

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

/* Enable the UART5 RX DMA Interrupt */

NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream7_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

/**************************************************************************************/

int main(void)

{

RCC_Configuration();

NVIC_Configuration();

GPIO_Configuration();

UART5_Configuration();

DMA_Configuration();

while(1); // Don't want to exit

}

/**************************************************************************************/

#ifdef  USE_FULL_ASSERT

/**

* @brief  Reports the name of the source file and the source line number

*   where the assert_param error has occurred.

* @param  file: pointer to the source file name

* @param  line: assert_param error line source number

* @retval None

*/

void assert_failed(uint8_t* file, uint32_t line)

{

/* User can add his own implementation to report the file name and line number,

ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

/* Infinite loop */

while (1)

{

}

}

#endif

/**

* @}

*/

/**************************************************************************************/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值