这里写自
List item
***
## 仅供记录,勿喷,纯新手欢迎交流
***
串口的初始化
图片: ![Alt](https://img-home.csdnimg.cn/images/20220524100510.png)
void rs4852Init(void)
{
//使能串口的端口时钟
rcu_periph_clock_enable(RCU_GPIOC);
//此处为led的端口
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_GPIOA);
//使能串口时钟
rcu_periph_clock_enable(RCU_UART3);
//led初始化
gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_14);
gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);
gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
//uart3 tx和rx的初始化
gpio_init(GPIOC, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_11);
//恢复uart3默认值
usart_deinit(UART3);
//固定配置可改变波特率以适应环境
usart_baudrate_set(UART3, 115200); //波特率为115200
usart_word_length_set(UART3, USART_WL_8BIT); //字长为8bit,如:0x01
usart_stop_bit_set(UART3, USART_STB_1BIT); //停止位1
usart_parity_config(UART3, USART_PM_NONE); //无奇偶校验位
//配置硬件控制流
usart_hardware_flow_rts_config(UART3, USART_RTS_DISABLE);
usart_hardware_flow_cts_config(UART3, USART_CTS_DISABLE);
//使能串口发送和接收
usart_transmit_config(UART3, USART_TRANSMIT_ENABLE);
usart_receive_config(UART3, USART_RECEIVE_ENABLE);
usart_enable(UART3);
//打开中断并配置优先级
nvic_irq_enable(UART3_IRQn, 0, 0);
//使能中断为RBNE
//这里我理解为当我们使用串口助手发送数据时,会进入中断
usart_interrupt_enable(UART3, USART_INT_RBNE);
rcu_periph_clock_enable(RCU_AF);
gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP, ENABLE);
gpio_init(RS485_2_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, RS485_2_PIN);
gpio_bit_reset(RS485_2_PORT, RS485_2_PIN);
}
宏定义
#define RS485_2_RCU RCU_GPIOA
#define RS485_2_PORT GPIOA
#define RS485_2_PIN GPIO_PIN_15
#define RS485_2_RECV gpio_bit_reset(RS485_2_PORT, RS485_2_PIN);
#define RS485_2_SEND gpio_bit_set(RS485_2_PORT, RS485_2_PIN);
串口发送程序
使用需添加字符串
如:unsigned char temp[]={“please transmit”};
void rs4852Write(uint8_t *txBuf, uint32_t bytes)
{
RS485_2_SEND;
for(int k = 0; k < 200; k++)
;
for(int i = 0; i < bytes;i++){
//串口发送函数
usart_data_transmit(UART3, txBuf[i]);
//等待一次发送的完成
while(RESET == usart_flag_get(UART3, USART_FLAG_TBE));
}
for(int k = 0; k < 2000; k++)
;
RS485_2_RECV;
}
标记文本
void UART3_IRQHandler(void)
{
uint8_t redata = 0;
//判断中断类型,rbne类型入口
//为了与其他类型区分,如果只有一个uart3中断不写也可
if(RESET != usart_interrupt_flag_get(UART3, USART_INT_FLAG_RBNE))
{
//串口接收函数
//redata 内部变量
redata = usart_data_receive(UART3);
//rs485_data全局变量方便调用led函数
rs485_data=redata;
//一个简单的通讯协议
if(rs485_data==0x01)
{
gpio_bit_set(GPIOA,GPIO_PIN_10);
}
else if(rs485_data==0x02)
{
gpio_bit_reset(GPIOA,GPIO_PIN_10);
}
//有头有尾的数据,en,好数据
//0xff 0x01 0x00
//帧头 数据位 帧尾
// 可增加数据位长度(自行思考,跟他有关recivedCount)
//此处rFrameBuf[]和recivedCount需自行定义
// if(redata==0xff)
// {
// recivedCount = 0;
// rFrameBuf[recivedCount]=redata;
// recivedCount++;
// }
// else if(redata==0x00)
// {
// if(recivedCount==2)
// {
// rFrameBuf[recivedCount]=redata;
// deal_re_fun();
// }
//
// }
// else
// {
// if(recivedCount>0&&recivedCount<2)
// {
// rFrameBuf[recivedCount]=redata;
// recivedCount++;
// }
// }
//清除标志位
usart_interrupt_flag_clear(UART3, USART_INT_FLAG_RBNE);
}
}
l数据位简单使用 反转led
void gd_eval_led_toggle(uint32_t gpio_periph, uint32_t pin)
{
gpio_bit_write(gpio_periph, pin, (bit_status)(1-gpio_input_bit_get(gpio_periph, pin)));
}
void deal_re_fun(void)
{
//有传入数据0xff 0x01 0x00
//根据第二位的值操控外设
switch(rFrameBuf[1])
{
case 0x01:
gd_eval_led_toggle(GPIOB,GPIO_PIN_14);
break;
case 0x02:
gd_eval_led_toggle(GPIOB,GPIO_PIN_15);
break;
case 0x03:
gd_eval_led_toggle(GPIOA,GPIO_PIN_10);
break;
}
}
**兄弟们**
**给个赞**
**处女座**
*西西里*