嵌入式:GD32F10X RS485通讯 接受与发送中断 中断控制led

这里写自

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;

	}
	
}

                              **兄弟们** 
                              **给个赞** 
                              **处女座** 
                               *西西里*
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值