gd32f130G8U6RS485实现串口接收数据

gd32f130G8U6RS485实现串⼝接收数据最近在实现lora通信⽹关的代码,⽤到了RS485实现串⼝接收数据,其主要代码及完整代码如下:
RS485串⼝初始化:
/*串⼝1初始化*/
void rs485_usart_init(){
rcu_periph_clock_enable(RCU_USART1);//使能串⼝时钟
usart_disable(USART1);
usart_baudrate_set(USART1, baudrate);//波特率
usart_parity_config(USART1, parity);//奇偶校验位
usart_word_length_set(USART1, wlen);//数据位
usart_stop_bit_set(USART1, stblen);//停⽌位
usart_hardware_flow_rts_config(USART1, USART_RTS_DISABLE);//禁⽤RTS
usart_hardware_flow_cts_config(USART1, USART_CTS_DISABLE);//⽆硬件数据流控制
usart_receive_config(USART1, USART_RECEIVE_ENABLE);//使能接收
usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);//使能发送
usart_enable(USART1);
drv_usart_nvic_init();
usart_interrupt_enable(USART1, USART_INT_RBNE);
}
定时器初始化
void Timer_init(void)
{
timer_parameter_struct timer_initpara;
/
*使能时钟*/
rcu_periph_clock_enable(RCU_TIMER1);
timer_deinit(TIMER1);
/* TIMER0 configuration */
timer_initpara.prescaler        =99;//分频系数
timer_initpara.alignedmode      = TIMER_COUNTER_EDGE;
unterdirection  = TIMER_COUNTER_UP;//计数⽅式
timer_initpara.period            =7199;//重载周期
timer_initpara.clockdivision    = TIMER_CKDIV_DIV1;//时钟分频因⼦
petitioncounter =0;
timer_init(TIMER1,&timer_initpara);//初始化
timer_interrupt_enable(TIMER1,TIMER_INT_UP);//允许中断
nvic_irq_enable(TIMER1_IRQn ,1,1);
timer_disable(TIMER1);
}
串⼝1中断服务函数
void USART1_IRQHandler(void)防伪印章
{
uint32_t res;
if( RESET !=usart_flag_get(USART1, USART_FLAG_RBNE))//接收到数据
裂缝检测{
res=usart_data_receive(USART1);
if((RS485_RX_STA &(1<<15))==0)//接收完的⼀批数据,还没有被处理,则不再接收其他数据{
if(RS485_RX_STA <rs485_rx_max)//串⼝1接收缓冲区还没满,还可以接收数据
{
timer_counter_value_config(TIMER1,0);//计数器清空
if(RS485_RX_STA ==0)//⼀次接收的开始时USART3_RX_STA = 0;
{
timer_enable(TIMER1);//使能定时器1
}
RS485_RX_BUF[RS485_RX_CNT]=res;//记录接收到的值
RS485_RX_STA++;//接收数据增加 1
RS485_RX_CNT++;
}
else//定义的最⼤缓冲区满了
{
RS485_RX_STA |=1<<15;//强制标记接收完成
}
}
}
}
RS485接收函数
void rs485_receive(uint8_t * buf){
铂钛催化剂if(((RS485_RX_STA>>15)&1)==1){
uint8_t rxlen=RS485_RX_CNT;
uint8_t i;
//led_on();
/* turn on LED2 */
gpio_bit_set(GPIOB, GPIO_PIN_0);
/* insert 200 ms delay */
delay_1ms(1000000);
/* turn on LED3 */
gpio_bit_reset(GPIOB, GPIO_PIN_0);
/* insert 200 ms delay */
delay_1ms(1000000);
/
/ gpio_bit_set(GPIOB, GPIO_PIN_0);
if(rxlen>0){
// gpio_bit_set(GPIOB, GPIO_PIN_0);
timer_disable(TIMER1);//关闭定时器
if(rxlen==RS485_RX_CNT&&rxlen){
for(i=0;i<rxlen;i++){
buf[i]=RS485_RX_BUF[i];
}
RS485_RX_CNT=0;
rs485_send(buf,rxlen);
}
}
RS485_RX_STA =0;
}
}
定时器1中断服务函数:
//定时器 1 中断服务程序⑥
void TIMER1_IRQHandler(void)//TIM1 中断
{
if(timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_UP)!= RESET)//检查 TIM3 更新中断发⽣与否{
timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_UP );//清除 TIM3 更新中断标志
RS485_RX_STA |=1<<15;// 标记接收完成
}
}
主函数代码如下:
int main(void)
{
systick_config();
Timer_init();
/*硬件初始化*/
rs485_hw_init();
/*串⼝初始化*/
rs485_usart_init();
LED_INIT();
RS485_RX_STA =0;
//gpio_bit_set(GPIOA,GPIO_PIN_8);
while(1)
{
//rs485_send(send_buf,2);
rs485_receive(rebuf);
// delay_1ms(1000);
}
}
完整代码如下:
#include "gd32f1x0.h"
#include "systick.h"
#include <stdio.h>
#include "gd32f1x0_rcu.h"
#include "gd32f1x0_usart.h"
#include "gd32f1x0_gpio.h"
#include "SPI.h"
#include "gd32f1x0_dma.h"
#include "gd32f1x0_misc.h"
#include "gd32f1x0_timer.h"
#include<stdio.h>
uint8_t vali_1=0;
unsigned char channel;
uint8_t send_buf[2]={0x01,0x00};
uint8_t rebuf[256];
uint16_t rs485_rx_max=64;
uint16_t RS485_RX_STA=0;
uint8_t RS485_RX_BUF[64];//接收缓冲,最⼤ 64 个字节.
//接收到的数据长度
uint8_t RS485_RX_CNT=0;
//串⼝信息
//static uint8_t reset_flag = 0;
static uint32_t baudrate=9600;
static uint32_t baudrate=9600;
static uint32_t parity = USART_PM_NONE;
static uint32_t wlen = USART_WL_8BIT;
static uint32_t stblen = USART_STB_1BIT;
void Timer_init(void);
static void drv_usart_nvic_init(void);
/*接收使能*/
void rs485_receive_enable(){
gpio_bit_set(GPIOA,  GPIO_PIN_8);
}
/
*发送使能*/
void rs485_send_enable(){
gpio_bit_reset(GPIOA,  GPIO_PIN_8);
}
void rs485_hw_init(){
/* enable the led clock */
rcu_periph_clock_enable(RCU_GPIOA);假牙清洁剂
/* connect port to USARTx_Tx */登船梯
gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_2);
/* connect port to USARTx_Rx */
gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_3);
/
* configure USART Tx as alternate function push-pull */
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2);
/* configure USART Rx as alternate function push-pull */
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_3);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_3); //配置使能端⼝
gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_8);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OTYPE_PP,  GPIO_PIN_8);
//gpio_bit_reset(GPIOA,  GPIO_PIN_8);
rs485_receive_enable();
}
/*中断初始化*/
static void drv_usart_nvic_init(void)
{
nvic_irq_enable(USART1_IRQn,0,0);
}
/*串⼝1初始化*/
void rs485_usart_init(){
rcu_periph_clock_enable(RCU_USART1);//使能串⼝时钟
usart_disable(USART1);
usart_baudrate_set(USART1, baudrate);//波特率
usart_parity_config(USART1, parity);//奇偶校验位
usart_word_length_set(USART1, wlen);//数据位
usart_stop_bit_set(USART1, stblen);//停⽌位
usart_hardware_flow_rts_config(USART1, USART_RTS_DISABLE);//禁⽤RTS
usart_hardware_flow_cts_config(USART1, USART_CTS_DISABLE);//⽆硬件数据流控制usart_receive_config(USART1, USART_RECEIVE_ENABLE);//使能接收
usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);//使能发送
usart_enable(USART1);
drv_usart_nvic_init();
usart_interrupt_enable(USART1, USART_INT_RBNE);
}
}
//发送数据
void rs485_send(uint8_t * buf,uint8_t len){
uint8_t t=0;
rs485_send_enable();
for(t=0;t<len;t++){
while(RESET ==usart_flag_get(USART1, USART_FLAG_TC));
usart_data_transmit(USART1, buf[t]);//发送数据
//gpio_bit_set(GPIOB, GPIO_PIN_0);
}
while(RESET ==usart_flag_get(USART1, USART_FLAG_TC));
rs485_receive_enable();
}
void LED_INIT(){
rcu_periph_clock_enable(RCU_GPIOB);
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0);
/* configure LEDs GPIO port */
//gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0); /* reset LEDs GPIO pin */
gpio_bit_reset(GPIOB, GPIO_PIN_0);
}
void Timer_init(void)
{
timer_parameter_struct timer_initpara;
/*使能时钟*/
rcu_periph_clock_enable(RCU_TIMER1);
timer_deinit(TIMER1);
/* TIMER0 configuration */
timer_initpara.prescaler        =99;//分频系数
timer_initpara.alignedmode      = TIMER_COUNTER_EDGE;
unterdirection  = TIMER_COUNTER_UP;//计数⽅式
timer_initpara.period            =7199;//重载周期
timer_initpara.clockdivision    = TIMER_CKDIV_DIV1;//时钟分频因⼦
petitioncounter =0;
timer_init(TIMER1,&timer_initpara);//初始化
timer_interrupt_enable(TIMER1,TIMER_INT_UP);//允许中断
nvic_irq_enable(TIMER1_IRQn ,1,1);
timer_disable(TIMER1);
相册内页}
void USART1_IRQHandler(void)
{
uint32_t res;
if( RESET !=usart_flag_get(USART1, USART_FLAG_RBNE))//接收到数据
{
res=usart_data_receive(USART1);
if((RS485_RX_STA &(1<<15))==0)//接收完的⼀批数据,还没有被处理,则不再接收其他数据{
if(RS485_RX_STA <rs485_rx_max)//串⼝1接收缓冲区还没满,还可以接收数据

本文发布于:2024-09-22 23:20:12,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/197018.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:接收   中断   使能   接收数据   数据   函数
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议