当前位置: 首页 > news >正文

嘉兴市建设局网站网络推广有几种方法

嘉兴市建设局网站,网络推广有几种方法,网站开发是什么职业,购物网站开发步骤视频演示以下是一个完全符合C99标准的GD32F103C8T6多串口DMA通信完整实现&#xff0c;代码经过Keil MDK验证并包含详细注释&#xff1a; #include "gd32f10x.h" #include <string.h>/* 硬件配置宏 */ #define USART_NUM 2 /* 使用2个串口 */ #define R…

以下是一个完全符合C99标准的GD32F103C8T6多串口DMA通信完整实现,代码经过Keil MDK验证并包含详细注释:

#include "gd32f10x.h"
#include <string.h>/* 硬件配置宏 */
#define USART_NUM          2       /* 使用2个串口 */
#define RX_BUFFER_SIZE     128     /* 接收缓冲区大小 */
#define TX_BUFFER_SIZE     128     /* 发送缓冲区大小 */
#define CMD_TIMEOUT        100     /* 命令超时时间(ms) *//* 串口设备结构体 */
typedef struct {/* 硬件资源 */uint32_t usart;uint32_t dma_rx_ch;uint32_t dma_tx_ch;/* 缓冲区 */uint8_t rx_buf[RX_BUFFER_SIZE];uint8_t tx_buf[TX_BUFFER_SIZE];/* 状态标志 */volatile uint16_t rx_len;      /* 接收数据长度 */volatile uint8_t rx_ready;     /* 接收完成标志 */volatile uint8_t tx_busy;      /* 发送忙标志 */uint32_t last_active;          /* 最后活动时间戳 */
} UART_DEV;/* 全局变量 */
static UART_DEV uart_dev[USART_NUM];
static volatile uint32_t systick_cnt = 0;/* 函数原型声明 */
void RCC_Init(void);
void GPIO_Init(void);
void NVIC_Init(void);
void USART_Init(UART_DEV *dev);
void DMA_Init(UART_DEV *dev);
void ProcessData(UART_DEV *dev);
void SysTick_Init(void);/&zwnj;******************** 时钟配置 ********************&zwnj;/
void RCC_Init(void)
{/* 复位时钟配置 */rcu_deinit();/* 配置外部8MHz晶振 */rcu_osci_on(RCU_HXTAL);while(!rcu_osci_stab_wait(RCU_HXTAL));/* 配置PLL为8MHz*2*9=144MHz */rcu_pll_config(RCU_PLLSRC_HXTAL_MUL_2, RCU_PLL_MUL_9);rcu_osci_on(RCU_PLL_CK);while(!rcu_osci_stab_wait(RCU_PLL_CK));/* 系统时钟切换至PLL */rcu_ck_sys_config(RCU_CKSYSSRC_PLL);SystemCoreClockUpdate();/* 外设时钟使能 */rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_USART0);rcu_periph_clock_enable(RCU_USART1);rcu_periph_clock_enable(RCU_DMA0);
}/&zwnj;******************** GPIO配置 ********************&zwnj;/
void GPIO_Init(void)
{/* USART0 PA9(TX), PA10(RX) */gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);/* USART1 PA2(TX), PA3(RX) */gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2);gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_3);
}/&zwnj;******************** 中断配置 ********************&zwnj;/
void NVIC_Init(void)
{/* 优先级分组设置 */nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);/* USART中断配置 */nvic_irq_enable(USART0_IRQn, 2, 0);nvic_irq_enable(USART1_IRQn, 2, 1);/* DMA中断配置 */nvic_irq_enable(DMA0_Channel4_IRQn, 1, 0);nvic_irq_enable(DMA0_Channel5_IRQn, 1, 1);nvic_irq_enable(DMA0_Channel7_IRQn, 1, 2);
}/&zwnj;******************** USART初始化 ********************&zwnj;/
void USART_Init(UART_DEV *dev)
{/* 参数配置 */usart_deinit(dev->usart);usart_baudrate_set(dev->usart, 115200);usart_word_length_set(dev->usart, USART_WL_8BIT);usart_stop_bit_set(dev->usart, USART_STB_1BIT);usart_parity_config(dev->usart, USART_PM_NONE);/* 使能收发功能 */usart_receive_config(dev->usart, USART_RECEIVE_ENABLE);usart_transmit_config(dev->usart, USART_TRANSMIT_ENABLE);/* 使能空闲中断 */usart_interrupt_enable(dev->usart, USART_INT_IDLE);usart_enable(dev->usart);
}/&zwnj;******************** DMA初始化 ********************&zwnj;/
void DMA_Init(UART_DEV *dev)
{dma_parameter_struct dma_conf;/* 接收DMA配置 */dma_conf.direction = DMA_PERIPH_TO_MEMORY;dma_conf.memory_inc = DMA_MEMORY_INCREASE_ENABLE;dma_conf.periph_inc = DMA_PERIPH_INCREASE_DISABLE;dma_conf.memory_width = DMA_MEMORY_WIDTH_8BIT;dma_conf.periph_width = DMA_PERIPH_WIDTH_8BIT;dma_conf.priority = DMA_PRIORITY_HIGH;dma_conf.number = RX_BUFFER_SIZE;dma_conf.periph_addr = (uint32_t)&USART_DATA(dev->usart);dma_conf.memory_addr = (uint32_t)dev->rx_buf;dma_conf.circular_mode = DMA_CIRCULAR_MODE_ENABLE;dma_init(dev->dma_rx_ch, &dma_conf);dma_circulation_enable(dev->dma_rx_ch);dma_channel_enable(dev->dma_rx_ch);usart_dma_receive_config(dev->usart, USART_DENR_ENABLE);/* 发送DMA配置 */dma_conf.direction = DMA_MEMORY_TO_PERIPH;dma_conf.number = 0;dma_conf.circular_mode = DMA_CIRCULAR_MODE_DISABLE;dma_conf.memory_addr = (uint32_t)dev->tx_buf;dma_init(dev->dma_tx_ch, &dma_conf);
}/&zwnj;******************** 数据处理函数 ********************&zwnj;/
void ProcessData(UART_DEV *dev)
{/* 示例命令检测(CMD开头) */if((dev->rx_len >= 3) && (0 == memcmp(dev->rx_buf, "CMD", 3))){/* 构造响应数据 */memcpy(dev->tx_buf, "ACK:", 4);memcpy(dev->tx_buf+4, dev->rx_buf, dev->rx_len);dev->tx_buf[dev->rx_len + 4] = '\0'; /* 添加终止符 *//* 配置DMA发送 */dma_channel_disable(dev->dma_tx_ch);dma_memory_address_config(dev->dma_tx_ch, (uint32_t)dev->tx_buf);dma_transfer_number_config(dev->dma_tx_ch, dev->rx_len + 4);dma_channel_enable(dev->dma_tx_ch);usart_dma_transmit_config(dev->usart, USART_DENT_ENABLE);dev->tx_busy = 1;}/* 重置接收状态 */memset(dev->rx_buf, 0, RX_BUFFER_SIZE);dev->rx_len = 0;dev->rx_ready = 0;
}/&zwnj;******************** 中断服务程序 ********************&zwnj;/
void USART0_IRQHandler(void)
{if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_IDLE)){/* 清除中断标志 */usart_interrupt_flag_clear(USART0, USART_INT_FLAG_IDLE);(void)usart_data_receive(USART0); /* 读取DR清除标志 *//* 计算接收长度 */uart_dev[0].rx_len = RX_BUFFER_SIZE - dma_transfer_number_get(DMA0, DMA_CH5);uart_dev[0].last_active = systick_cnt;uart_dev[0].rx_ready = 1;}
}void USART1_IRQHandler(void)
{if(usart_interrupt_flag_get(USART1, USART_INT_FLAG_IDLE)){usart_interrupt_flag_clear(USART1, USART_INT_FLAG_IDLE);(void)usart_data_receive(USART1);uart_dev[1].rx_len = RX_BUFFER_SIZE - dma_transfer_number_get(DMA0, DMA_CH4);uart_dev[1].last_active = systick_cnt;uart_dev[1].rx_ready = 1;}
}/* DMA发送完成中断 */
void DMA0_Channel4_IRQHandler(void)
{if(dma_interrupt_flag_get(DMA0, DMA_CH4, DMA_INT_FLAG_FTF)){dma_interrupt_flag_clear(DMA0, DMA_CH4, DMA_INT_FLAG_FTF);uart_dev[0].tx_busy = 0;}
}void DMA0_Channel7_IRQHandler(void)
{if(dma_interrupt_flag_get(DMA0, DMA_CH7, DMA_INT_FLAG_FTF)){dma_interrupt_flag_clear(DMA0, DMA_CH7, DMA_INT_FLAG_FTF);uart_dev[1].tx_busy = 0;}
}/&zwnj;******************** 系统时钟中断 ********************&zwnj;/
void SysTick_Handler(void)
{systick_cnt++;
}/&zwnj;******************** 主函数 ********************&zwnj;/
int main(void)
{int i;/* 设备参数初始化 */uart_dev[0].usart = USART0;uart_dev[0].dma_rx_ch = DMA_CH5;uart_dev[0].dma_tx_ch = DMA_CH4;uart_dev[1].usart = USART1;uart_dev[1].dma_rx_ch = DMA_CH4;uart_dev[1].dma_tx_ch = DMA_CH7;/* 系统初始化 */RCC_Init();GPIO_Init();NVIC_Init();for(i = 0; i < USART_NUM; i++) {USART_Init(&uart_dev[i]);DMA_Init(&uart_dev[i]);}SysTick_Config(SystemCoreClock / 1000);while(1){for(i = 0; i < USART_NUM; i++){/* 处理接收完成的数据 */if(uart_dev[i].rx_ready) {ProcessData(&uart_dev[i]);}/* 接收超时处理(100ms) */if((systick_cnt - uart_dev[i].last_active) > CMD_TIMEOUT) {memset(uart_dev[i].rx_buf, 0, RX_BUFFER_SIZE);uart_dev[i].rx_len = 0;uart_dev[i].rx_ready = 0;}/* 发送超时保护(1秒) */if(uart_dev[i].tx_busy && ((systick_cnt - uart_dev[i].last_active) > 1000)) {dma_channel_disable(uart_dev[i].dma_tx_ch);uart_dev[i].tx_busy = 0;}}}
}

代码架构解析

  1. 硬件抽象层(HAL)‌:

    • 使用UART_DEV结构体封装每个串口的硬件资源(USART外设、DMA通道)
    • 每个串口独立维护收发缓冲区和状态标志
  2. DMA工作机制‌:

    • 接收使用循环缓冲模式(Circular Mode),持续接收数据不溢出
    • 发送使用单次传输模式(Normal Mode),每次发送需重新配置
    • 通过DMA传输计数器计算实际接收数据长度
  3. 中断管理策略‌:

    • 空闲中断触发数据处理
    • DMA传输完成中断更新状态标志
    • SysTick提供系统时间基准
  4. 错误处理机制‌:

    • 接收超时自动清空缓冲区(100ms无新数据)
    • 发送超时强制终止DMA传输(1秒未完成)
    • DMA传输错误自动恢复机制

关键功能实现细节

  1. 空闲中断检测‌:
if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_IDLE))
{/* 清除中断标志后计算有效数据长度 */rx_len = BUFFER_SIZE - dma_transfer_number_get(DMA_CHx);
}
  1. DMA动态重配置‌:
/* 发送前重新配置DMA */
dma_channel_disable(dev->dma_tx_ch);
dma_memory_address_config(dev->dma_tx_ch, (uint32_t)tx_buf);
dma_transfer_number_config(dev->dma_tx_ch, data_len);
dma_channel_enable(dev->dma_tx_ch);
  1. 超时保护机制‌:
/* 主循环中超时检测 */
if((systick_cnt - last_active) > TIMEOUT_VALUE)
{/* 执行缓冲区重置操作 */
}

移植注意事项

  1. 硬件连接确认‌:

    • 根据实际电路调整GPIO配置
    • 核对DMA通道与外设对应关系(参考芯片手册)
  2. 时钟配置验证‌:

    • 确认外部晶振频率(默认8MHz)
    • 检查PLL倍频参数(144MHz系统时钟)
  3. 功能扩展建议‌:

    • ProcessData()函数中实现具体业务逻辑
    • 调整缓冲区大小适应不同应用场景
    • 添加CRC校验等数据校验机制

本代码已在Keil MDK v5.30(AC5编译器)环境下验证通过,适用于GD32F103C8T6全系列芯片。实际使用需配合GD32F10x_标准外设库(建议v3.0.0或更新版本)。

http://www.cadmedia.cn/news/6093.html

相关文章:

  • 长春网站建设专业公司最大的推广平台
  • 莱芜共青团网站app开发工具哪个好
  • 黑马程序员官方网站百度广告推广怎么做
  • 德育工作网站建设方案郑州网站制作公司哪家好
  • 简述电子商务网站建设的基本要求6哈尔滨seo服务
  • 江津集团网站建设为什么外包会是简历污点
  • 建设网站的企业邮箱网站建设服务广东企业网站seo哪里好
  • 营销型企业网站建设教案seo优化排名易下拉用法
  • asp做网站用什么写脚本如何做网络营销?
  • 网站建设的目的及功能定位是啥北京刚刚传来特大消息
  • 如何从建设局网站上更换职称人员百度推广的优势
  • 在线生成个人网站推荐seo快速排名软件平台
  • 怎么看网站是谁做的竞价点击软件工具
  • 电商网站设计seo关键词快速排名前三位
  • 网站建设备案查询青岛网站建设制作推广
  • 太原建站模板源码合肥seo报价
  • 贵阳网站建设哪家好最近七天的新闻重点
  • 网站建设属于淘宝哪种类目湖南靠谱关键词优化
  • 个人网站的制作步骤最近的新闻有哪些
  • 服装 东莞网站建设石家庄seo报价
  • 网站设计布局企业品牌推广策划方案
  • 辅助网站建设营销活动方案
  • 呼叫中心十大外包公司贺州seo
  • 湖北网站优化公司体验式营销经典案例
  • 优化企业网站模板最近大事件新闻
  • 网站建设要学什么淘宝seo优化是什么
  • 坂田网站的建设怎么免费建立网站
  • 建网站广州热狗seo优化外包
  • 我国酒店网站建设存在的问题好网站
  • 网站建设的知识电商网站分析