//少说话,多做事,以下是我验证过没有问题的串口发送接受数据
//使用MCU stm8s105c6 UART2
//初始化时调用:
GPIO_DeInit(GPIOD);
/* Configure PD5/6 */
GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_IN_PU_NO_IT);//发送数据IO
GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT);//接受数据IO
UART2_DeInit();
UART2_Init(2400,UART2_WORDLENGTH_8D,UART2_STOPBITS_1,UART2_PARITY_NO,
UART2_SYNCMODE_CLOCK_DISABLE,
UART2_MODE_TX_ENABLE|UART2_MODE_RX_ENABLE); //波特率 2400 8位数据
//1个停止位 没有奇偶校验 关闭SCK 允许串口接受和发送
UART2_Cmd(ENABLE);//启用串口
UART2_ITConfig(UART2_IT_RXNE_OR,ENABLE);//允许接受中断
//操作串口(发送接受数据)时调用:
if(UART2_GetFlagStatus(UART2_FLAG_TC))
{//当前没有在发数据,可以发数据
UART2_SendData8(Uart2TexData);
UART2_ClearFlag(UART2_FLAG_TC);
}
UART2_ClearITPendingBit(UART2_FLAG_RXNE);//清中断标志位
Uart2RecData = UART2_ReceiveData8();//接受中断数据//后面两句需要发在
串口接受中断中
void UART2_DeInit(void)
{
u8 dummy = 0;
/*
to the UART2_SR register followed by a Read to the UART2_DR
register */
dummy = UART2->SR;
dummy = UART2->DR;
UART2->BRR2 = UART2_BRR2_RESET_VALUE; /*
value 0x00 */
UART2->BRR1 = UART2_BRR1_RESET_VALUE; /*
value 0x00 */
UART2->CR1 = UART2_CR1_RESET_VALUE; /*
0x00 */
UART2->CR2 = UART2_CR2_RESET_VALUE; /*
0x00 */
UART2->CR3 = UART2_CR3_RESET_VALUE; /*
0x00 */
UART2->CR4 = UART2_CR4_RESET_VALUE; /*
0x00 */
UART2->CR5 = UART2_CR5_RESET_VALUE; /*
0x00 */
UART2->CR6 = UART2_CR6_RESET_VALUE; /*
0x00 */
}
void UART2_Init(u32 BaudRate, UART2_WordLength_TypeDef WordLength,
UART2_StopBits_TypeDef StopBits, UART2_Parity_TypeDef Parity,
UART2_SyncMode_TypeDef SyncMode, UART2_Mode_TypeDef Mode)
{
u8 BRR2_1, BRR2_2 = 0;
u32 BaudRate_Mantissa, BaudRate_Mantissa100 = 0;
/* assert_param: BaudRate value should be <= 625000 bps */
assert_param(IS_UART2_BAUDRATE_OK(BaudRate));
assert_param(IS_UART2_WORDLENGTH_OK(WordLength));
assert_param(IS_UART2_STOPBITS_OK(StopBits));
assert_param(IS_UART2_PARITY_OK(Parity));
/* assert_param: UART2_Mode value should exclude values such as
UART2_ModeTx_Enable|UART2_ModeTx_Disable */
assert_param(IS_UART2_MODE_OK((u8)Mode));
/* assert_param: UART2_SyncMode value should exclude values such as
UART2_CLOCK_ENABLE|UART2_CLOCK_DISABLE */
assert_param(IS_UART2_SYNCMODE_OK((u8)SyncMode));
UART2->CR1 &= (u8)(~UART2_CR1_M); /**
UART2->CR1 |= (u8)WordLength; /**
to UART2_WordLength value */
UART2->CR3 &= (u8)(~UART2_CR3_STOP); /**
UART2->CR3 |= (u8)StopBits; /**
to UART2_StopBits value */
UART2->CR1 &= (u8)(~(UART2_CR1_PCEN | UART2_CR1_PS )); /**
the Parity Control bit */
UART2->CR1 |= (u8)Parity; /**
UART2_Parity value */
UART2->BRR1 &= (u8)(~UART2_BRR1_DIVM); /**
of UARTDIV */
UART2->BRR2 &= (u8)(~UART2_BRR2_DIVM); /**
of UARTDIV */
UART2->BRR2 &= (u8)(~UART2_BRR2_DIVF); /**
of UARTDIV */
/**
UART2_BaudRate value */
BaudRate_Mantissa = ((u32)CLK_GetClockFreq() / (BaudRate <
BaudRate_Mantissa100 = (((u32)CLK_GetClockFreq() * 100) / (BaudRate
<
/**
the BRR2 register*/
BRR2_1 = (u8)((u8)(((BaudRate_Mantissa100 - (BaudRate_Mantissa *
100))
<
of UARTDIV */
BRR2_2 = (u8)((BaudRate_Mantissa >> 4) & (u8)0xF0);
UART2->BRR2 = (u8)(BRR2_1 | BRR2_2);
UART2->BRR1 = (u8)BaudRate_Mantissa; /**
mantissa of UARTDIV */
UART2->CR2 &= (u8)~(UART2_CR2_TEN | UART2_CR2_REN); /**
Transmitter and Receiver before seting the LBCL, CPOL and CPHA bits */
UART2->CR3 &= (u8)~(UART2_CR3_CPOL | UART2_CR3_CPHA |
UART2_CR3_LBCL); /**
Clock pulse */
UART2->CR3 |= (u8)((u8)SyncMode & (u8)(UART2_CR3_CPOL |
UART2_CR3_CPHA | UART2_CR3_LBCL)); /**
Phase, Last Bit Clock pulse */
if ((u8)Mode & (u8)UART2_MODE_TX_ENABLE)
{
UART2->CR2 |= (u8)UART2_CR2_TEN; /**
bit */
}
else
{
UART2->CR2 &= (u8)(~UART2_CR2_TEN); /**
Disable bit */
}
if ((u8)Mode & (u8)UART2_MODE_RX_ENABLE)
{
UART2->CR2 |= (u8)UART2_CR2_REN; /**
bit */
}
else
{
UART2->CR2 &= (u8)(~UART2_CR2_REN); /**
Disable bit */
}
/**
Clock pulse bits according to UART2_Mode value */
if ((u8)SyncMode&(u8)UART2_SYNCMODE_CLOCK_DISABLE)
{
UART2->CR3 &= (u8)(~UART2_CR3_CKEN); /**
bit */
/**
setting the correct I/O Port register according the product package and
line configuration*/
}
else
{
UART2->CR3 |= (u8)((u8)SyncMode & UART2_CR3_CKEN);
}
}
void UART2_Cmd(FunctionalState NewState)
{
if (NewState != DISABLE)
{
UART2->CR1 &= (u8)(~UART2_CR1_UARTD); /**
}
else
{
UART2->CR1 |= UART2_CR1_UARTD; /**
consumption) */
}
}
void UART2_ITConfig(UART2_IT_TypeDef UART2_IT, FunctionalState NewState)
{
u8 uartreg, itpos = 0x00;
assert_param(IS_UART2_CONFIG_IT_OK(UART2_IT));
assert_param(IS_FUNCTIONALSTATE_OK(NewState));
/* Get the UART2 register index */
uartreg = (u8)(UART2_IT >> 0x08);
/* Get the UART2 IT index */
itpos = (u8)((u8)1 <
if (NewState != DISABLE)
{
/**
if (uartreg == 0x01)
{
UART2->CR1 |= itpos;
}
else if (uartreg == 0x02)
{
UART2->CR2 |= itpos;
}
else if (uartreg == 0x03)
{
UART2->CR4 |= itpos;
}
else
{
UART2->CR6 |= itpos;
}
}
else
{
/**
if (uartreg == 0x01)
{
UART2->CR1 &= (u8)(~itpos);
}
else if (uartreg == 0x02)
{
UART2->CR2 &= (u8)(~itpos);
}
else if (uartreg == 0x03)
{
UART2->CR4 &= (u8)(~itpos);
}
else
{
UART2->CR6 &= (u8)(~itpos);
}
}
}
u8 UART2_ReceiveData8(void)
{
return ((u8)UART2->DR);
}
void UART2_SendData8(u8 Data)
{
/* Transmit Data */
UART2->DR = Data;
}
FlagStatus UART2_GetFlagStatus(UART2_Flag_TypeDef UART2_FLAG)
{
FlagStatus status = RESET;
/* Check parameters */
assert_param(IS_UART2_FLAG_OK(UART2_FLAG));
/* Check the status of the specified UART2 flag*/
if (UART2_FLAG == UART2_FLAG_LBDF)
{
if ((UART2->CR4 & (u8)UART2_FLAG) != (u8)0x00)
{
/* UART2_FLAG is set*/
status = SET;
}
else
{
/* UART2_FLAG is reset*/
status = RESET;
}
}
else if (UART2_FLAG == UART2_FLAG_SBK)
{
if ((UART2->CR2 & (u8)UART2_FLAG) != (u8)0x00)
{
/* UART2_FLAG is set*/
status = SET;
}
else
{
/* UART2_FLAG is reset*/
status = RESET;
}
}
else if ((UART2_FLAG == UART2_FLAG_LHDF) || (UART2_FLAG ==
UART2_FLAG_LSF))
{
if ((UART2->CR6 & (u8)UART2_FLAG) != (u8)0x00)
{
/* UART2_FLAG is set*/
status = SET;
}
else
{
/* UART2_FLAG is reset*/
status = RESET;
}
}
else
{
if ((UART2->SR & (u8)UART2_FLAG) != (u8)0x00)
{
/* UART2_FLAG is set*/
status = SET;
}
else
{
/* UART2_FLAG is reset*/
status = RESET;
}
}
/* Return the UART2_FLAG status*/
return status;
}
void UART2_ClearFlag(UART2_Flag_TypeDef UART2_FLAG)
{
assert_param(IS_UART2_CLEAR_FLAG_OK(UART2_FLAG));
/*
if (UART2_FLAG == UART2_FLAG_RXNE)
{
UART2->SR = (u8)~(UART2_SR_RXNE);
}
/*
else if (UART2_FLAG == UART2_FLAG_LBDF)
{
UART2->CR4 &= (u8)(~UART2_CR4_LBDF);
}
/*
else if (UART2_FLAG == UART2_FLAG_LHDF)
{
UART2->CR6 &= (u8)(~UART2_CR6_LHDF);
}
/*
else
{
UART2->CR6 &= (u8)(~UART2_CR6_LSF);
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』