/*************************************************************/
/* this programme for UART4 Communication */
/* Company: New Future */
/* Programmer: windy */
/* phone: 13891912727 weixin same name */
/* Email: cjfwindy@163.com */
/* Time: 2022-08-20 17:16 */
/* Copyright(C) 2021 New Future All rights reserved */
/*************************************************************/
#include "global.h"
//=================================================================================
unsigned char REC4_Data[300],REC4_Count=0,Buffer4[300];
TYPE_BYTE_IO _RAMB;
char* gpUart4TxAddress; /* uart transmit buffer address */
int gUart4TxCnt; /* uart transmit data number */
//=================================================================================
/*----函数:向PC传输一行字符串----*/
void UART4_print(char * head)
{
BYTE i,j;
PIN_4851RE = 0;
j = strlen(head);
for (i=0; i<j; i++)
{
UART4_Send(head[i]);
}
PIN_4851RE = 1;
}
//-----------------------------------------------------------------
void Uart4_BSend(char * head, int nub)
{
int i;
PIN_4851RE = 0;
for (i=0; i<nub; i++)
{
UART4_Send(head[i]);
}
//UART4_Send(0x0D);
//UART4_Send(0x0A);
PIN_4851RE = 1;
}
//-----------------------------------------------------------------
/*----函数:向串口发送一个字节的数据----*/
void UART4_Send(BYTE a)
{
UART4_CheckOERR();
while (!(UART4->SR & USART_SR_TXE));
UART4->DR = a;
//NOP();
//while ((UART4->SR & USART_SR_TXE) != 1);
//while ((UART4->SR & USART_SR_TC) != 1);
while ((UART4->SR & USART_SR_TC) == 0);
}
//-----------------------------------------------------------------
void REC4_SER(void)
{
if (b4Timeover)
{
b4Timeover = 0;
F_UART4_First = 1;
}
if (!F_UART4_REC) return;
F_UART4_REC = 0;
REC4_Count = 0;
// high 5A A5 05 82 03 00 00 0C
if((0x05==REC4_Data[2]) && ( 0x82==REC4_Data[3]) && (0x03==REC4_Data[4]) && (0x00==REC4_Data[5]))
{
high = REC4_Data[6]<<8;
high = high + REC4_Data[7];
WriteMemory3(0x300, high);
}
// high 5A A5 05 82 03 30 00 0C
if((0x05==REC4_Data[2]) && ( 0x82==REC4_Data[3]) && (0x03==REC4_Data[4]) && (0x30==REC4_Data[5]))
{
VDistance = REC4_Data[6]<<8;
VDistance = VDistance + REC4_Data[7];
WriteMemory3(0x330, VDistance);
}
}
//-----------------------------------------------------------------
void UART4TX_SER(void)
{
if (0 == gUart4TxCnt) return;
if (!(UART4->SR & USART_SR_TC)) return;
UART4_CheckOERR();
if( gUart4TxCnt > 0 )
{
UART4->DR = *gpUart4TxAddress;
gpUart4TxAddress++;
gUart4TxCnt--;
if (0 == gUart4TxCnt)
{
while ((UART4->SR & USART_SR_TC) != 1);
PIN_4851RE = 1;
}
}
}
//=================================================================================
// 初始化IO 串口1
// pclk2:PCLK2时钟频率(Mhz)
// bound:波特率
void uart4_init(u32 pclk1,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp = (float)(pclk1*1000000)/(bound*16); // 得到USARTDIV
mantissa = temp; // 得到整数部分
fraction = (temp-mantissa)*16; // 得到小数部分
mantissa <<= 4;
mantissa += fraction;
RCC->AHB1ENR |= 1<<2; // 使能PORTC时钟
RCC->APB1ENR |= 1<<19; // 使能串口时钟
GPIO_Set(GPIOC,PIN10|PIN11,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PC10,PC11,复用功能,上拉输出
GPIO_AF_Set(GPIOC,10,8); //PC10,AF8
GPIO_AF_Set(GPIOC,11,8);
RCC->APB1RSTR |= 1<<19; // 复位串口1
RCC->APB1RSTR &= ~(1<<19); // 停止复位
//波特率设置
UART4->BRR = mantissa; // 波特率设置
UART4->CR1 |= 0X200C; // 1位停止,无校验位.
//使能接收中断
UART4->CR1 |= 1<<2; // 串口接收使能
UART4->CR1 |= 1<<5; // 接收缓冲区非空中断使能
MY_NVIC_Init(3,3,UART4_IRQn,2); // 组2,最低优先级
}
//-----------------------------------------------------------------
BYTE UART4_CheckOERR(void)
{
BYTE volatile Temp; // volatile 防止被优化
if(UART4->SR & 0x000F) // 1: Overrun error is detected
{
Temp = UART4->SR;
Temp = UART4->DR;
//Temp++;
return 1;
}
return 0;
}
//-----------------------------------------------------------------
void UART4_SendData( char* txbuf, int txnum )
{
if( txnum < 1 ){
return;
}
PIN_4851RE = 0;
UART4_CheckOERR();
while (!(UART4->SR & USART_SR_TXE));
gpUart4TxAddress = txbuf;
gUart4TxCnt = txnum;
if( txnum == 1)
{
UART4->DR = *gpUart4TxAddress;
gUart4TxCnt--;
}
else
{
UART4->DR = *gpUart4TxAddress;
gpUart4TxAddress++;
gUart4TxCnt--;
}
}
//=================================================================================
stm32f407UART4串口4标准例程
需积分: 0 66 浏览量
2023-01-03
23:43:32
上传
评论 3
收藏 2KB RAR 举报
山野码农
- 粉丝: 8
- 资源: 38