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

网络营销的企业网站全国电商排名前20名

网络营销的企业网站,全国电商排名前20名,如何注册公司和商标,空壳网站STM32 DMA学习日记 写于2024/9/28晚 文章目录 STM32 DMA学习日记1. DMA简介2. I/O方式2.1 程序查询方式2.2 程序中断方式2.3 DMA方式 3.DMA框图4. 相关寄存器4.1 DMA中断状态寄存器#xff08;DMA_ISR#xff09;4.2 DMA中断标志清除寄存器#xff08;DMA_IFCR#xff09;…STM32 DMA学习日记 写于2024/9/28晚 文章目录 STM32 DMA学习日记1. DMA简介2. I/O方式2.1 程序查询方式2.2 程序中断方式2.3 DMA方式 3.DMA框图4. 相关寄存器4.1 DMA中断状态寄存器DMA_ISR4.2 DMA中断标志清除寄存器DMA_IFCR4.3 DMA通道x传输数量寄存器DMA_CNDTRx4.4 DMA通道x配置寄存器DMA_CCRx4.5 DMA通道x外设地址寄存器DMA_CPARx4.6 DMA通道x存储器地址寄存器DMA_CMARx 5.例程解析5.1 DMA相关HAL库驱动介绍 1. DMA简介 DMA全称为Direct Memory Access即直接存储器访问。DMA 传输方式无需 CPU 直接控制传输也没有中断处理方式那样保留现场和恢复现场的过程通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路能使 CPU 的效率大为提高。是计算机的4种I/O方式中的一种。 2. I/O方式 输入/输出系统实现主机与I/O设备之间的数据传送可以采用不同的控制方式各种方式在代价、性能、解决问题的着重点等方面各不相同常用的I/O方式有程序查询、程序中断、DMA和通道等其中前两种方式更依赖于CPU中程序指令的执行。下面我们来简介一下计算机组成原理中的4中I/O方式中的前三种。 2.1 程序查询方式 信息交换的控制完全由CPU执行程序实现程序查询方式接口中设置一个数据缓冲寄存器(数据端口)和一个设备状态寄存器(状态端口)。主机进行I/O操作时先发出询问信号读取设备的状态并根据设备状态决定下一步操作究竟是进行数据传送还是等待。 程序查询方式的工作流程如下(见图7.2): ①CPU执行初始化程序并预置传送参数。②向I/O接口发出命令字启动I/O设备。③从外设接口读取其状态信息。④CPU不断查询I/O设备状态直到外设准备就绪。⑤传送一次数据。⑥修改地址和计数器参数。⑦判断传送是否结束若未结束转第③步直到计数器为0 在这种控制方式下CPU一旦启动I/O,就必须停止现行程序的运行并在现行程序中插入一段程序。程序查询方式的主要特点是CPU有“踏步”等待现象CPU与I/O串行工作。这种方式的接口设计简单、设备量少但CPU在信息传送过程中要花费很多时间来查询和等待而且在一段时间内只能和一台外设交换信息效率大大降低。 2.2 程序中断方式 程序中断方式的思想CPU在程序中安排好在某个时机启动某台外设然后CPU继续执行当前的程序不需要像查询方式那样一直等待外设准备就绪。一旦外设完成数据传送的准备工作就主动向CPU发出中断请求请求CPU为自己服务。在可以响应中断的条件下CPU暂时中止正在执行的程序转去执行中断服务程序为外设服务在中断服务程序中完成一次主机与外设之间的数据传送传送完成后CPU返回原来的程序如图7.3所示。 2.3 DMA方式 DMA方式是一种完全由硬件进行成组信息传送的控制方式它具有程序中断方式的优点即在数据准备阶段CPU与外设并行工作。DMA方式在外设与内存之间开辟一条“直接数据通道”,信息传送不再经过CPU,降低了CPU在传送数据时的开销因此称为直接存储器存取方式。 由于数据传送不经过CPU,也就不需要保护、恢复CPU现场等烦琐操作。 这种方式适用于磁盘、显卡、声卡、网卡等高速设备大批量数据的传送它的硬件开销比较大。在DMA方式中中断的作用仅限于故障和正常传送结束时的处理。 DMA控制器的组成 在DMA方式中对数据传送过程进行控制的硬件称为DMA控制器(DMA接口)。当I/O设备需要进行数据传送时通过DMA控制器向CPU提出DMA传送请求CPU响应之后将让出系统总线由DMA控制器接管总线进行数据传送。其主要功能如下 接受外设发出的DMA请求并向CPU发出总线请求。CPU响应并发出总线响应信号DMA接管总线控制权进入DMA操作周期。确定传送数据的主存单元地址及长度并自动修改主存地址计数和传送长度计数。规定数据在主存和外设间的传送方向发出读写等控制信号执行数据传送操作。向CPU报告DMA操作结束。 DMA方式和中断方式的区别 DMA方式和中断方式的重要区别如下 ①中断方式是程序的切换需要保护和恢复现场而DMA方式不中断现行程序无需保护现场除了预处理和后处理其他时候不占用任何CPU资源。 ②对中断请求的响应只能发生在每条指令执行结束时(执行周期后);而对DMA请求的响应可以发生在任意一个机器周期结束时(取指、间址、执行周期后均可)。 ③中断传送过程需要CPU的干预而DMA传送过程不需要CPU的干预因此数据传输率非常高适合于高速外设的成组数据传送。④DMA请求的优先级高于中断请求。 ⑤中断方式具有处理异常事件的能力而DMA方式仅局限于大批数据的传送。 ⑥从数据传送来看中断方式靠程序传送DMA方式靠硬件传送。 3.DMA框图 STM32F103ZET6 有两个 DMA 控制器DMA1 和 DMA2本章我们仅针对 DMA1 进行介绍。 下面先来学习 DMA 控制器框图通过学习 DMA 控制器框图会有一个很好的整体掌握同时对之后的编程也会有一个清晰的思路。 图中我们标记了 3 处位置起作用分别是 ① DMA 请求 如果外设想要通过 DMA 来传输数据必须先给 DMA 控制器发送 DMA 请求DMA 收到请求信号之后控制器会给外设一个应答信号当外设应答后且 DMA 控制器收到应答信号之后就会启动 DMA 的传输直到传输完毕。 STM32F103 共有 DMA1 和 DMA2 两个控制器DMA1 有 7 个通道DMA2 有 5 个通道不同的 DMA 控制器的通道对应着不同的外设请求这决定了我们在软件编程上该怎么设置具体见表 29.1.1.1DMA 请求映像表。 ② 通道 DMA 具有 12 个独立可编程的通道其中 DMA1 有 7 个通道DMA2 有 5 个通道每个通道对应不同的外设的 DMA 请求。虽然每个通道可以接收多个外设的请求但是同一时间只能接收一个不能同时接收多个。 ③ 仲裁器 当发生多个 DMA 通道请求时就意味着有先后响应处理的顺序问题这个就由仲裁器管理。仲裁器管理 DMA 通道请求分为两个阶段。第一阶段属于软件阶段可以在 DMA_CCRx寄存器中设置有 4 个等级非常高高中和低四个优先级。第二阶段属于硬件阶段如果两个或以上的 DMA 通道请求设置的优先级一样则他们优先级取决于通道编号编号越低优先权越高比如通道 0 高于通道 1。在大容量产品和互联型产品中DMA1 控制器拥有高于 DMA2 控制器的优先级。 4. 相关寄存器 4.1 DMA中断状态寄存器DMA_ISR 该寄存器是查询当前 DMA 传输的状态我们常用的是 TCIFx 位即通道 DMA 传输完成与否的标志。注意此寄存器为只读寄存器所以在这些位被置位之后只能通过其他的操作来清除。 4.2 DMA中断标志清除寄存器DMA_IFCR 该寄存器是用来清除 DMA_ISR 的对应位的通过写 0 清除。在 DMA_ISR 被置位后我们必须通过向该寄存器对应的位写 1 来清除。 4.3 DMA通道x传输数量寄存器DMA_CNDTRx 4.4 DMA通道x配置寄存器DMA_CCRx 该寄存器控制着 DMA 很多相关信息包括数据宽度、外设及存储器宽度、通道优先级、增量模式、传输方向、中断允许、使能等所以说 DMA_CCRx 是 DMA 传输的核心控制寄存器。 4.5 DMA通道x外设地址寄存器DMA_CPARx 该寄存器是用来存储 STM32 外设的地址比如我们平常使用串口 1那么该寄存器必须写入 0x40013804其实就是USART1_DR。其他外设就可以修改成其他对应外设地址就好了。 4.6 DMA通道x存储器地址寄存器DMA_CMARx DMA通道x存储器地址寄存器用来存放存储器的地址该寄存器和 DMA_CPARx差不多所以就不列出来了。举个应用的例子在程序中我们使用到一个 g_sendbuf[5200]数组来做存储器那么我们在 DMA_CMARx 中写入g_sendbuf 即可。 5.例程解析 5.1 DMA相关HAL库驱动介绍 驱动函数关联寄存器功能描述__HAL_RCC_DMAx_CLK_ENABLE(…)RCC_AHBENR使能DMAx时钟HAL_DMA_Init(…)DMA_CCR初始化DMAHAL_DMA_Start_IT(…)DMA_CCR/CPAR/CMAR/CNDTR开始DMA传输__HAL_LINKDMA(…)用来连接DMA和外设句柄HAL_UART_Transmit_DMA(…)CCR/CPAR/CMAR/CNDTR/USART_CR3使能DMA发送启动传输__HAL_DMA_GET_FLAG(…)DMA_ISR查询DMA传输通道的状态__HAL_DMA_ENABLE(…)DMA_CCR(EN)使能DMA外设__HAL_DMA_DISABLE(…)DMA_CCR(EN)失能DMA外设 DMA外设相关结构体DMA_HandleTypeDef 和 DMA_InitTypeDef typedef struct __DMA_HandleTypeDef {DMA_Channel_TypeDef *Instance; /*! Register base address 寄存器基地址 */DMA_InitTypeDef Init; /*! DMA communication parameters DMA参数 */ } DMA_HandleTypeDef; typedef struct {uint32_t Direction /* DMA传输方向 */uint32_t PeriphInc /* 外设地址(非)增量 */uint32_t MemInc /* 存储器地址(非)增量*/uint32_t PeriphDataAlignment /* 外设数据宽度 */uint32_t MemDataAlignment /* 存储器数据宽度 */uint32_t Mode /* 操作模式 */uint32_t Priority /* DMA通道优先级 */} DMA_InitTypeDef;以DMA方式传输串口数据配置步骤 使能DMA时钟:__HAL_RCC_DMA1_CLK_ENABLE初始化DMA:HAL_DMA_Init函数初始化DMA相关参数 __HAL_LINKDMA函数连接DMA和外设使能串口的DMA发送启动传输:HAL_UART_Transmit_DMA查询DMA传输状态:__HAL_DMA_GET_FLAG 查询通道传输状态 __ HAL_DMA_GET_COUNTER 获取当前传输剩余数据量DMA中断使用:HAL_NVIC_EnableIRQ HAL_NVIC_SetPriority编写中断服务函数 xxx_IRQHandler DMA_HandleTypeDef g_dma_handle; /* DMA句柄 */ extern UART_HandleTypeDef g_uart1_handle; /* UART句柄 *//*** brief 串口TX DMA初始化函数* note 这里的传输形式是固定的, 这点要根据不同的情况来修改* 从存储器 - 外设模式/8位数据宽度/存储器增量模式** param dmax_chy : DMA的通道, DMA1_Channel1 ~ DMA1_Channel7, DMA2_Channel1 ~ DMA2_Channel5* 某个外设对应哪个DMA, 哪个通道, 请参考STM32中文参考手册 V10 10.3.7节* 必须设置正确的DMA及通道, 才能正常使用! * retval 无*/ void dma_init(DMA_Channel_TypeDef* DMAx_CHx) {if ((uint32_t)DMAx_CHx (uint32_t)DMA1_Channel7) /* 大于DMA1_Channel7, 则为DMA2的通道了 */{__HAL_RCC_DMA2_CLK_ENABLE(); /* DMA2时钟使能 */}else {__HAL_RCC_DMA1_CLK_ENABLE(); /* DMA1时钟使能 */}__HAL_LINKDMA(g_uart1_handle, hdmatx, g_dma_handle); /* 将DMA与USART1联系起来(发送DMA) *//* Tx DMA配置 */g_dma_handle.Instance DMAx_CHx; /* USART1_TX使用的DMA通道为: DMA1_Channel4 */g_dma_handle.Init.Direction DMA_MEMORY_TO_PERIPH; /* DIR 1 , 存储器到外设模式 */g_dma_handle.Init.PeriphInc DMA_PINC_DISABLE; /* 外设非增量模式 */g_dma_handle.Init.MemInc DMA_MINC_ENABLE; /* 存储器增量模式 */g_dma_handle.Init.PeriphDataAlignment DMA_PDATAALIGN_BYTE; /* 外设数据长度:8位 */g_dma_handle.Init.MemDataAlignment DMA_MDATAALIGN_BYTE; /* 存储器数据长度:8位 */g_dma_handle.Init.Mode DMA_NORMAL; /* 外设流控模式 */g_dma_handle.Init.Priority DMA_PRIORITY_MEDIUM; /* 中等优先级 */HAL_DMA_Init(g_dma_handle); }main.c #include ./SYSTEM/sys/sys.h #include ./SYSTEM/usart/usart.h #include ./SYSTEM/delay/delay.h #include ./USMART/usmart.h #include ./BSP/LED/led.h #include ./BSP/LCD/lcd.h #include ./BSP/KEY/key.h #include ./BSP/DMA/dma.hconst uint8_t TEXT_TO_SEND[] {正点原子 STM32 DMA 串口实验}; /* 要循环发送的字符串 */ #define SEND_BUF_SIZE (sizeof(TEXT_TO_SEND) 2) * 200 /* 发送数据长度, 等于sizeof(TEXT_TO_SEND) 2的200倍. */uint8_t g_sendbuf[SEND_BUF_SIZE]; /* 发送数据缓冲区 */ extern DMA_HandleTypeDef g_dma_handle; /* DMA句柄 */ extern UART_HandleTypeDef g_uart1_handle; /* UART句柄 */int main(void) {uint8_t key 0;uint16_t i, k;uint16_t len;uint8_t mask 0;float pro 0; /* 进度 */HAL_Init(); /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */delay_init(72); /* 延时初始化 */usart_init(115200); /* 串口初始化为115200 */led_init(); /* 初始化LED */lcd_init(); /* 初始化LCD */key_init(); /* 初始化按键 */dma_init(DMA1_Channel4); /* 初始化串口1 TX DMA */lcd_show_string(30, 50, 200, 16, 16, STM32, RED);lcd_show_string(30, 70, 200, 16, 16, DMA TEST, RED);lcd_show_string(30, 90, 200, 16, 16, ATOMALIENTEK, RED);lcd_show_string(30, 110, 200, 16, 16, KEY0:Start, RED);len sizeof(TEXT_TO_SEND);k 0;for (i 0; i SEND_BUF_SIZE; i) /* 填充ASCII字符集数据 */{if (k len) /* 入换行符 */{if (mask){g_sendbuf[i] 0x0a;k 0;}else{g_sendbuf[i] 0x0d;mask;}}else /* 复制TEXT_TO_SEND语句 */{mask 0;g_sendbuf[i] TEXT_TO_SEND[k];k;}}i 0;while (1){key key_scan(0);if (key KEY0_PRES) /* KEY0按下 */{printf(\r\nDMA DATA:\r\n);lcd_show_string(30, 130, 200, 16, 16, Start Transimit...., BLUE);lcd_show_string(30, 150, 200, 16, 16, %, BLUE); /* 显示百分号 */HAL_UART_Transmit_DMA(g_uart1_handle, g_sendbuf, SEND_BUF_SIZE);/* 等待DMA传输完成此时我们来做另外一些事情比如点灯 * 实际应用中传输数据期间可以执行另外的任务 */while (1){if ( __HAL_DMA_GET_FLAG(g_dma_handle, DMA_FLAG_TC4)) /* 等待 DMA1_Channel4 传输完成 */{__HAL_DMA_CLEAR_FLAG(g_dma_handle, DMA_FLAG_TC4);HAL_UART_DMAStop(g_uart1_handle); /* 传输完成以后关闭串口DMA */break;}pro DMA1_Channel4-CNDTR; /* 得到当前还剩余多少个数据 */len SEND_BUF_SIZE; /* 总长度 */pro 1 - (pro / len); /* 得到百分比 */pro * 100; /* 扩大100倍 */lcd_show_num(30, 150, pro, 3, 16, BLUE);} lcd_show_num(30, 150, 100, 3, 16, BLUE); /* 显示100% */lcd_show_string(30, 130, 200, 16, 16, Transimit Finished!, BLUE); /* 提示传送完成 */}i;delay_ms(10);if (i 20){LED0_TOGGLE(); /* LED0闪烁,提示系统正在运行 */i 0;}} }
http://www.hkea.cn/news/14342064/

相关文章:

  • 晋江论坛怎么搜索seo教学网seo
  • 网站建设中间件收费在线字体设计网站
  • 租号网站开发小程序登录失败是什么原因
  • 网站展示型和营销型有什么区别设计师培训班怎么样
  • 再网站里做商家店铺thesis wordpress
  • 网站怎么维护wordpress做音乐网插件吗
  • 网站开发分前台后台医药网站建设公司
  • 电子商务网站建设 第二版免费seo提交工具
  • 个人备案的网站可以做商城成都网站海口网站建设
  • 怎么建立企业网站扁平风格网站 模板免费下载
  • 织梦 网站模板专业做物业网站的公司
  • 做腰椎核磁证网站是 收 七seo网站模板下载
  • 做网站客户没有付定金新网站如何做seo
  • 摄影网站备案山东省工程建设信息官方网站
  • 黄岩区住房保障建设局网站idc数据中心排名
  • 怎么上国外购物网站怎么制作小程序卖东西
  • 自己做公司网站难吗哪里有手机网站建设联系方式
  • 网站用excel做数据库自己有服务器怎么做网站
  • 上海网站公司排名淄博亿泰
  • 豆芽网站建设彩票理财网站建设
  • 做网站需要学啥有没有好玩的网页游戏
  • 百度网站改版做网站应达到什么效果
  • 北京南站到北京西站运营推广的方式和渠道有哪些
  • 企业门户网站建设方案后台管理地方网站成本
  • 租用海外服务器的网站有域名吗网站开发怎么样?
  • 网站建设的功能模型seo基础知识包括什么
  • 网站优化的虚拟主机装2个wordpress
  • 单位网站建设方案北京中天人建设工程有限公司网站
  • 网站开发core文件作用上海闵行刚刚发生的
  • 网站怎么制作成软件iis搭建多个网站