2019年5月12日星期日

開啟STM32F103C8T6的三個 uart open 3 uart with stm32f103c8t6 by using keil

使用keil 開發stm32f103c8t6 開啟三組硬體 uart

description

use stm32f103c8t6 3 uarts
send char and can recive each uart port
main.c
#include "stm32f10x.h"
#include "UART.h"

int main(void)
{
 USART1_Init(460800);
 USART2_Init(460800);
 USART3_Init(460800);
 USART1_PutString("HI~");
 USART2_PutString("HI~");
 USART3_PutString("HI~");
 while(1)
 {
  char recive1 = USART1_GetChar();
  USART1_PutChar(recive1);
  char recive2 = USART2_GetChar();
  USART2_PutChar(recive2);
  char recive3 = USART3_GetChar();
  USART3_PutChar(recive3);
 }
}

UART.h
#ifndef __UART_H
#define __UART_H

#ifdef __cplusplus
 extern "C" {
#endif

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"
#include 

#define BUF_SIZE1 16
#define BUF_SIZE2 16
#define BUF_SIZE3 16
//uart1
void USART1_Init(uint32_t baudrate);
void USART1_PutChar(char c);
void USART1_PutString(char *s);
uint16_t USART1_GetChar(void);

//uart2
void USART2_Init(uint32_t baudrate);
void USART2_PutChar(char c);
void USART2_PutString(char *s);
uint16_t USART2_GetChar(void);

//uart3
void USART3_Init(uint32_t baudrate);
void USART3_PutChar(char c);
void USART3_PutString(char *s);
uint16_t USART3_GetChar(void);

#ifdef __cplusplus
}
#endif

#endif

UART.c
#include "UART.h"
char buf1[BUF_SIZE1];
char buf2[BUF_SIZE2];
char buf3[BUF_SIZE3];

uint8_t receivedByte1;
uint8_t receivedByte2;
uint8_t receivedByte3;
//UART1
void USART1_Init(uint32_t baudrate)
{
 //Initialization struct
 USART_InitTypeDef USART_InitStruct;
 GPIO_InitTypeDef GPIO_InitStruct;
 
 //USART1 initialization
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
 USART_InitStruct.USART_BaudRate = baudrate;
 USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
 USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
 USART_InitStruct.USART_Parity = USART_Parity_No;
 USART_InitStruct.USART_StopBits = USART_StopBits_1;
 USART_InitStruct.USART_WordLength = USART_WordLength_8b;
 USART_Init(USART1, &USART_InitStruct);
 USART_Cmd(USART1, ENABLE);
 
 //GPIO initialization for Tx and Rx pin
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
 // Tx pin initialization as push-pull alternate function
 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
 GPIO_Init(GPIOA, &GPIO_InitStruct);
 // Rx pin initialization as input floating
 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
 GPIO_Init(GPIOA, &GPIO_InitStruct);
}

void USART1_PutChar(char c)
{
 // Wait until transmit data register is empty
 while (!USART_GetFlagStatus(USART1, USART_FLAG_TXE));
 // Send a char using USART1
 USART_SendData(USART1, c);
}

void USART1_PutString(char *s)
{
 // Send a string
 while (*s)
 {
  USART1_PutChar(*s++);
 }
}

uint16_t USART1_GetChar()
{
 // Wait until data is received
 while (!USART_GetFlagStatus(USART1, USART_FLAG_RXNE));
 // Read received char
 return USART_ReceiveData(USART1);
}
//UART2
void USART2_Init(uint32_t baudrate)
{
 // Initialization struct
 USART_InitTypeDef USART_InitStruct;
 GPIO_InitTypeDef GPIO_InitStruct;
 
 //USART2 initialization
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
 USART_InitStruct.USART_BaudRate = baudrate;
 USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
 USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
 USART_InitStruct.USART_Parity = USART_Parity_No;
 USART_InitStruct.USART_StopBits = USART_StopBits_1;
 USART_InitStruct.USART_WordLength = USART_WordLength_8b;
 USART_Init(USART2, &USART_InitStruct);
 USART_Cmd(USART2, ENABLE);
 
 //GPIO initialization for Tx and Rx pin
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
 // Tx pin initialization as push-pull alternate function
 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
 GPIO_Init(GPIOA, &GPIO_InitStruct);
 // Rx pin initialization as input floating
 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
 GPIO_Init(GPIOA, &GPIO_InitStruct);
}

void USART2_PutChar(char c)
{
 // Wait until transmit data register is empty
 while (!USART_GetFlagStatus(USART2, USART_FLAG_TXE));
 // Send a char using USART2
 USART_SendData(USART2, c);
}

void USART2_PutString(char *s)
{
 // Send a string
 while (*s)
 {
  USART2_PutChar(*s++);
 }
}

uint16_t USART2_GetChar()
{
 // Wait until data is received
 while (!USART_GetFlagStatus(USART2, USART_FLAG_RXNE));
 // Read received char
 return USART_ReceiveData(USART2);
}

void USART3_Init(uint32_t baudrate)
{
 // Initialization struct
 USART_InitTypeDef USART_InitStruct;
 GPIO_InitTypeDef GPIO_InitStruct;
 
 //USART3 initialization
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
 USART_InitStruct.USART_BaudRate = baudrate;
 USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
 USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
 USART_InitStruct.USART_Parity = USART_Parity_No;
 USART_InitStruct.USART_StopBits = USART_StopBits_1;
 USART_InitStruct.USART_WordLength = USART_WordLength_8b;
 USART_Init(USART3, &USART_InitStruct);
 USART_Cmd(USART3, ENABLE);
 
 //GPIO initialization for Tx and Rx pin
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
 // Tx pin initialization as push-pull alternate function
 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
 GPIO_Init(GPIOB, &GPIO_InitStruct);
 // Rx pin initialization as input floating
 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;
 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
 GPIO_Init(GPIOB, &GPIO_InitStruct);
}

void USART3_PutChar(char c)
{
 // Wait until transmit data register is empty
 while (!USART_GetFlagStatus(USART3, USART_FLAG_TXE));
 // Send a char using USART2
 USART_SendData(USART3, c);
}

void USART3_PutString(char *s)
{
 // Send a string
 while (*s)
 {
  USART3_PutChar(*s++);
 }
}
uint16_t USART3_GetChar()
{
 // Wait until data is received
 while (!USART_GetFlagStatus(USART3, USART_FLAG_RXNE));
 // Read received char
 return USART_ReceiveData(USART3);
}
https://github.com/windyman24/STM32F103_learn

沒有留言:

發佈留言

打賞按讚