高级会员

- 积分
- 582
- 金钱
- 582
- 注册时间
- 2018-4-16
- 在线时间
- 107 小时
|
发表于 2017-10-1 23:38:52
|
显示全部楼层
/********************************************************************
* 功能:USART初始化
* 参数:bound 波特率
********************************************************************/
void USART_Init(uint32_t BaudRate)
{
LL_IOP_GRP1_EnableClock (LL_IOP_GRP1_PERIPH_GPIOA);
LL_APB2_GRP1_EnableClock (LL_APB2_GRP1_PERIPH_USART1);
LL_RCC_SetUSARTClockSource(LL_RCC_USART1_CLKSOURCE_PCLK2);
LL_GPIO_SetPinMode (GPIOA, LL_GPIO_PIN_9, LL_GPIO_MODE_ALTERNATE); //配置为复用模式
LL_GPIO_SetAFPin_8_15 (GPIOA, LL_GPIO_PIN_9, LL_GPIO_AF_4); //设置功能复用
LL_GPIO_SetPinSpeed (GPIOA, LL_GPIO_PIN_9, LL_GPIO_SPEED_FREQ_HIGH); //设置io输出速度
// LL_GPIO_SetPinOutputType(GPIOA, LL_GPIO_PIN_9, LL_GPIO_OUTPUT_PUSHPULL); //设置为推挽输出
LL_GPIO_SetPinPull (GPIOA, LL_GPIO_PIN_9, LL_GPIO_PULL_UP); //配置为上拉
LL_GPIO_SetPinMode (GPIOA, LL_GPIO_PIN_10, LL_GPIO_MODE_ALTERNATE);
LL_GPIO_SetAFPin_8_15 (GPIOA, LL_GPIO_PIN_10, LL_GPIO_AF_4);
LL_GPIO_SetPinSpeed (GPIOA, LL_GPIO_PIN_10, LL_GPIO_SPEED_FREQ_HIGH);
// LL_GPIO_SetPinOutputType(GPIOA, LL_GPIO_PIN_10, LL_GPIO_OUTPUT_PUSHPULL);
LL_GPIO_SetPinPull (GPIOA, LL_GPIO_PIN_10, LL_GPIO_PULL_UP);
LL_USART_SetTransferDirection(USART1, LL_USART_DIRECTION_TX_RX); //同时启用 TX RX
LL_USART_ConfigCharacter (USART1, LL_USART_DATAWIDTH_8B, LL_USART_PARITY_NONE, LL_USART_STOPBITS_1); //配置为8位字节 不开启奇偶校验 1停止位
LL_USART_SetBaudRate (USART1, SystemCoreClock, LL_USART_OVERSAMPLING_16, BaudRate); //时钟频率 过采样16倍 波特率
LL_USART_Enable(USART1); //使能串口
NVIC_SetPriority(USART1_IRQn, 0); //设置中断优先级
NVIC_EnableIRQ(USART1_IRQn); //允许中断触发
while((!(LL_USART_IsActiveFlag_TEACK(USART1))) || (!(LL_USART_IsActiveFlag_REACK(USART1)))){}
#if EN_USART1_RX
LL_USART_EnableIT_RXNE(USART1); //启用RX中断
#endif
// LL_USART_EnableIT_ERROR(USART1);
}
/**********************************************************
* 功能:发送数据
* 参数:buf 发送缓冲区首地址
* len 待发送的字节数
**********************************************************/
void USART_Send_Data(uint8_t *buf,uint8_t len)
{
uint8_t t;
while (!LL_USART_IsActiveFlag_TC(USART1)){}
for(t=0;t<len;t++) //循环发送数据
{
LL_USART_TransmitData8(USART1, (uint8_t) buf[t]); //发送数据
while (!LL_USART_IsActiveFlag_TC(USART1)){} //等待发送完成
}
}
/*******************************************************************
* 功能:中断方式接收数据
*******************************************************************/
void USART1_IRQHandler(void)
{
if(LL_USART_IsActiveFlag_RXNE(USART1) && LL_USART_IsEnabledIT_RXNE(USART1))
{
USART_RX_BUF[0] = LL_USART_ReceiveData8(USART1);
USART_RX_CNT=1;
}
}
用LL写的 |
|