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

重庆网站建设公司怎么做网页设计与制作考试2020

重庆网站建设公司怎么做,网页设计与制作考试2020,平台建设网站公司,帝国网站系统做专题文章目录DACDAC_CTL 控制寄存器定时器TIMERx_CTL1 控制寄存器改变波形频率DMADMA和外设配合DMA_CHxCNT计数寄存器波形曲线总结源码DAC 如下面框图所示#xff0c;使能外部触发后#xff08;通过设置 DAC_CTL 寄存器的 DTENx 位#xff09;#xff0c; 当已经选择的触发事件… 文章目录DACDAC_CTL 控制寄存器定时器TIMERx_CTL1 控制寄存器改变波形频率DMADMA和外设配合DMA_CHxCNT计数寄存器波形曲线总结源码DAC 如下面框图所示使能外部触发后通过设置 DAC_CTL 寄存器的 DTENx 位 当已经选择的触发事件发 生 DAC 保持数据DACx_DH会被转移到 DAC 数据输出寄存器DACx_DO经过一段时间之后模拟输出变得有效。DAC引脚上的模拟输出电压DACoutputVREF×DAC_DO/4096。 对于12位的DAC保持数据DACx_DH可以通过对DACx_R12DH、DACx_L12DH和DACx_R8DH中的任意一个寄存器写入数据来配置。 在外部触发使能的情况下通过设置DAC_CTL寄存器的DDMAENx位来使能DMA请求。当有外部硬件触发的时候不是软件触发则产生一个DMA请求。 DAC_CTL 控制寄存器 名称描述DWBW0[3:0]DAC0 噪声波位宽DDMAEN0DAC0 DMA 使能DWM0[1:0]DAC0 噪声波模式DTSEL0[2:0]DAC0 触发选择DBOFF0DAC0 输出缓冲区DEN0DAC0 使能DTEN0DAC0 触发使能配置DAC其实还是配置的上面这些东西只不过代码里面是调用了固件库函数来配的。 其中在DAC0外部触发使能(DTEN01)的情况下DAC0外部触发源选择TIMER6 TRGO。 /*DAC通道输出配置定时器6触发不开启输出缓存*/ static void sin_adc_channel_config(void) {//DAC外设复位dac_deinit();/* DAC触发禁能 */dac_trigger_disable(SIN_DAC);//DAC噪声波模式选择dac_wave_mode_config(SIN_DAC, DAC_WAVE_DISABLE);//DAC输出缓冲区禁能dac_output_buffer_disable(SIN_DAC);/* DAC触发源的选择*/dac_trigger_source_config(SIN_DAC,DAC_TRIGGER_T6_TRGO);/* DAC的DMA功能使能 */dac_dma_enable(SIN_DAC);/* DAC触发使能 */dac_trigger_enable(SIN_DAC);/* DAC使能 */dac_enable(SIN_DAC); }定时器 选用基本定时器TIM6触发DAC。 如下面框图所示TIMER_CK驱动计数器预分频器预分频值由TIMERx_PSC寄存器确定TIMER_CK经过预分频器产生PSC_CLK。向上计数模式下计数器从0开始向上连续计数到自动加载值(在TIMERx_CAR寄存器中)然后重新从0开始向上计数并产生上溢事件。此时如果TIMERx_SWEVG寄存器的UPG位置1计数值会被清0并产生更新事件。发生更新事件时所有的寄存器(重复计数器自动重载寄存器预分频寄存器)都将被更新。 TIMERx_CTL1 控制寄存器 其中MMC[2:0]位控制TRGO信号的选择使用timer_master_output_trigger_source_select函数主模式控制器选择更新事件作为TRGO。 使用timer_update_event_enable函数将TIMERx_SWEVG寄存器的UPG位置1那么定时器产生上溢事件时会产生更新事件然后触发TIMERx_TRGO。进而触发DAC。 //定时器主输出触发源选择timer_master_output_trigger_source_select(SIN_TIM,TIMER_TRI_OUT_SRC_UPDATE);//定时器更新事件使能timer_update_event_enable(SIN_TIM);改变波形频率 这里面设置不同的定时周期会改变输出波形的频率。 按照下面这样设置最终会得到4KHZ的正弦波。 /*TIMx触发配置*/ void sin_timx_trigger_function_config(void) {timer_parameter_struct timer_initpara;rcu_periph_clock_enable(SIN_TIM_CLK);timer_deinit(SIN_TIM);/* TIMER6 configuration */timer_initpara.prescaler 1-1;//预分频timer_initpara.counterdirection TIMER_COUNTER_UP;//向上计数timer_initpara.period 225-1;//定时周期timer_init(SIN_TIM,timer_initpara);//定时器主输出触发源选择timer_master_output_trigger_source_select(SIN_TIM,TIMER_TRI_OUT_SRC_UPDATE);//定时器更新事件使能timer_update_event_enable(SIN_TIM); }DMA DMA控制器提供了一种硬件的方式在外设和存储器之间或者存储器和存储器之间传输数据。无需CPU的介入使CPU可以专注在处理其他系统功能上。 DMA传输 从源地址读取数据后将读取的数据存储到目的地址。 AHB从接口配置DMAAHB主接口进行数据传输仲裁器进行DMA请求的优先级管理。 dma_parameter_struct结构体 名称描述periph_addr外设基地址periph_width外设数据传输宽度memory_addr存储器基地址memory_width存储器数据传输宽度numberDMA通道数据传输数量priorityDMA通道传输软件优先级periph_inc外设地址生成算法模式memory_inc存储器地址生成算法模式directionDMA通道数据传输方向 初始化设定上面结构体的值其实还是对DMA_CHxCTL寄存器的一些设置。设置传输方向为从存储器读出并写入外设。 存储器和外设都独立的支持两种地址生成算法固定模式和增量模式。寄存器DMA_CHxCTL的PNAGA和MNAGA位用来设置存储器和外设的地址生成算法固定模式中地址一直固定为初始化的基地址增量模式中下一次传输数据的地址是当前地址加1(或2、4取决于数据传输宽度) 前面波形数组uint16_t Sine[POINT_NUM2]定义的是U16所以设置的宽度也是16bit。 //DMA配置 static void sin_dma_config(void) {dma_parameter_struct dma_init_struct;/* enable DMA CLK */rcu_periph_clock_enable(SIN_DMA_CLK);/* deinitialize DMA channel3(USART0 tx) */dma_deinit(SIN_DMA, SIN_DMA_CHANNEL);dma_init_struct.direction DMA_MEMORY_TO_PERIPHERAL; // dma_init_struct.memory_addr ;dma_init_struct.memory_inc DMA_MEMORY_INCREASE_ENABLE;dma_init_struct.memory_width DMA_MEMORY_WIDTH_16BIT; // dma_init_struct.number ; // dma_init_struct.periph_addr ;dma_init_struct.periph_inc DMA_PERIPH_INCREASE_DISABLE;dma_init_struct.periph_width DMA_PERIPHERAL_WIDTH_16BIT;dma_init_struct.priority DMA_PRIORITY_ULTRA_HIGH;dma_init(SIN_DMA, SIN_DMA_CHANNEL, dma_init_struct);/* configure DMA mode 存储器到存储器DMA传输禁能*/dma_memory_to_memory_disable(SIN_DMA, SIN_DMA_CHANNEL); } DMA和外设配合 循环模式用来处理连续的外设请求循环模式中当每次DMA传输完成后CNT值会被重新载入且传输完成标志位会被置1。 DMA会一直响应外设的请求直到通道使能位DMA_CHxCTL寄存器的CHEN位被清0。 当DMA控制器在同一时间接收到多个外设请求时仲裁器将根据外设请求的优先级来决定响应哪一个外设请求。当通道具有相同的软件优先级时编号低的通道优先级高。 多个外设请求被映射到同一个DMA 通道。这些请求信号在经过逻辑或后进入DMA。通过配置对应外设的寄存器每个外设 的请求均可以独立的开启或关闭。DMA1各通道请求表如下由于外设是DAC_CH0所以选用DMA1的Channel2通道。 为了保证数据的有效传输 DMA控制器中引入了外设和存储器的握手机制。请求信号由外设发出表明外设已经准备好发送或接收数据应答信号由DMA控制器响应表明DMA控制器已经发送AHB命令去访问外设。 DMA_CHxCNT计数寄存器 CNT[15:0]该寄存器表明还有多少数据等待被传输。一旦通道使能该寄存器为只读的并在每个DMA传输之后值减1。如果该寄存器的值为0无论通道开启与否都不会有数据传输。如果该通道工作在循环模式下一旦通道的传输任务完成该寄存器会被自动重装载为初始设置值。程序中用dma_transfer_number_config函数配置该寄存器的值。 #define ARRAYNUM(arr_name) (uint32_t)(sizeof(arr_name)/sizeof(*(arr_name))) #define DAC0_R12DH_ADDRESS ((uint32_t)0x40007408) void sin_dma_function_config(void) { //DMAx的通道y的存储器基地址配置dma_memory_address_config(SIN_DMA,SIN_DMA_CHANNEL,(uint32_t)Sine);//配置DMAx通道y还有多少数据要传输dma_transfer_number_config(SIN_DMA,SIN_DMA_CHANNEL,ARRAYNUM(Sine));//DMAx的通道y的外设基地址配置dma_periph_address_config(SIN_DMA,SIN_DMA_CHANNEL,DAC0_R12DH_ADDRESS);//DMA循环模式开启dma_circulation_enable(SIN_DMA, SIN_DMA_CHANNEL);//DMA的通道使能dma_channel_enable(SIN_DMA, SIN_DMA_CHANNEL); }外设基地址配置 DAC0_R12DH地址偏移 0x08 DAC 基地址 0x4000 7400 DAC0_R12DH地址:0x4000 7408 波形曲线 其中可以修改点数使波形变得平滑也可以修改波形幅值也可以修改波形形状。 #! python3 #codingutf-8import matplotlib.pyplot as plt import numpy as np import math#修改本变量可以更改点数如16、32、64等 POINT_NUM 120pi math.pi#一个周期 POINT_NUM 个点 n np.linspace(0,2*pi,POINT_NUM)#计算POINT_NUM个点的正弦值 a map(math.sin,n)r [] for i in a:#调整幅值至在0~1区间i1 #按3.3V电压调整幅值#i* 3.3/2 #求取dac数值12位dac LSB 3.3V/2**12 ri round(i*2**12/3.3) #检查参数if ri 4095:ri 4095#得到dac数值序列r.append( ri )print(list(map(int,r)))#写入序列到文件 with open(py_dac_sinWav.c,w,encoding gb2312) as f:print(list(map(int,r)),file f)#绘图 plt.plot(n,r,-o) plt.show() 如果得到的值为a那么(a/4096)*3.3就是实际输出的电压值。 uint16_t Sine[POINT_NUM2] { 1241, 1307, 1372, 1437, 1501, 1565, 1628, 1690, 1750, 1809, 1867, 1922, 1976, 2028, 2077, 2125, 2169, 2212, 2251, 2288, 2322, 2352, 2380, 2404, 2426, 2444, 2458, 2469, 2477, 2481, 2482, 2480, 2474, 2464, 2451, 2435, 2415, 2393, 2367, 2337, 2305, 2270, 2232, 2191, 2147, 2101, 2053, 2002, 1949, 1895, 1838, 1780, 1720, 1659, 1597, 1533, 1469, 1405, 1339, 1274, 1208, 1143, 1078, 1013, 949, 886, 824, 762, 703, 644, 588, 533, 480, 430, 381, 335, 292, 251, 213, 177, 145, 116, 90, 67, 47, 31, 18, 9, 3, 0, 1, 5, 13, 24, 39, 57, 78, 102, 130, 161, 195, 231, 271, 313, 358, 405, 455, 506, 560, 616, 673, 732, 793, 855, 917, 981, 1045, 1110, 1176, 1241 };效果如下。 总结 1.使能TIM6触发DAC其中将TIMERx_SWEVG寄存器的UPG位置1定时器产生上溢事件时会产生更新事件主模式控制器选择更新事件作为TRGO。由于设置了DAC的DAC_CTL寄存器的DDMAENx位来使能DMA请求当有外部硬件触发的时候DAC则产生一个DMA请求。 3.使用DMA传输数据从存储器读出数据并写入外设也就是说DMA从Sine数组的地址读数据写到DAC0_R12DH寄存器里面。 2.触发事件发生 DAC保持数据DACx_DH会被转移到DAC数据输出寄存器DACx_DO经过一段时间之后DAC引脚上的输出电压DACoutputVREF×DAC_DO/4096。 4.总而言之定时器从0开始向上连续计数到自动加载值然后重新从0开始向上计数并产生上溢事件TIMERx_SWEVG寄存器的UPG位置1计数值会被清0并产生更新事件主模式控制器选择更新事件作为TRGO触发DAC产生DMA请求搬运数组的数据。由于DMA设置为循环模式当每次DMA传输完成后CNT值(待传输的数据个数)会被重新载入DMA会一直响应外设的请求如此循环往复把波形曲线的值写到DAC0_R12DH寄存器里面然后在DAC引脚上输出电压DACoutputVREF×DAC_DO/4096。 5.使用一个外设看用户手册可以知道外设大概都有哪些功能要使用外设的某些功能都需要怎么配置寄存器。写程序的话可能提供库函数库函数就是把配置寄存器的那些代码给封装起来了然后使用库函数把外设用起来就好了。 源码 GD32F307DAC输出波形-单片机文档类资源-CSDN文库 bsp_dac.c文件如下 main.c调用void sin_app(void)函数即可。 #include systick.h #include bsp_dac.h #define POINT_NUM 32 #define POINT_NUM2 120#define ARRAYNUM(arr_name) (uint32_t)(sizeof(arr_name)/sizeof(*(arr_name))) #define DAC0_R12DH_ADDRESS ((uint32_t)0x40007408)#define DAC_OUT_VAL (0x09B3)#define SIN_TIM TIMER6 #define SIN_TIM_CLK RCU_TIMER6#define SIN_DAC DAC0 #define SIN_DAC_CLK RCU_DAC#define SIN_PIN GPIO_PIN_4 #define SIN_GPIO_PORT GPIOA #define SIN_GPIO_CLK RCU_GPIOA#define SIN_DMA DMA1 #define SIN_DMA_CLK RCU_DMA1 #define SIN_DMA_CHANNEL DMA_CH2uint16_t Sine12bit[POINT_NUM] {1241, 1491, 1731, 1950, 2141, 2295, 2405, 2468, 2481, 2443, 2356, 2223, 2050, 1844, 1613, 1367, 1116, 870, 639, 433, 260, 127, 40, 2, 14, 77, 188, 342, 532, 752, 991, 1241 }; uint16_t Sine[POINT_NUM2] { 1241, 1307, 1372, 1437, 1501, 1565, 1628, 1690, 1750, 1809, 1867, 1922, 1976, 2028, 2077, 2125, 2169, 2212, 2251, 2288, 2322, 2352, 2380, 2404, 2426, 2444, 2458, 2469, 2477, 2481, 2482, 2480, 2474, 2464, 2451, 2435, 2415, 2393, 2367, 2337, 2305, 2270, 2232, 2191, 2147, 2101, 2053, 2002, 1949, 1895, 1838, 1780, 1720, 1659, 1597, 1533, 1469, 1405, 1339, 1274, 1208, 1143, 1078, 1013, 949, 886, 824, 762, 703, 644, 588, 533, 480, 430, 381, 335, 292, 251, 213, 177, 145, 116, 90, 67, 47, 31, 18, 9, 3, 0, 1, 5, 13, 24, 39, 57, 78, 102, 130, 161, 195, 231, 271, 313, 358, 405, 455, 506, 560, 616, 673, 732, 793, 855, 917, 981, 1045, 1110, 1176, 1241 };/*DAC引脚配置*/ static void sin_dac_gpio_config(void) {/* enable the clock of peripherals */rcu_periph_clock_enable(SIN_GPIO_CLK);rcu_periph_clock_enable(SIN_DAC_CLK);rcu_periph_clock_enable(RCU_AF);/* once enabled the DAC, the corresponding GPIO pin is connected to the DAC converter automatically */gpio_init(SIN_GPIO_PORT, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, SIN_PIN);}/*DAC通道输出配置定时器6触发不开启输出缓存*/ static void sin_adc_channel_config(void) {dac_deinit();/* configure the DAC0 */dac_trigger_disable(SIN_DAC);dac_wave_mode_config(SIN_DAC, DAC_WAVE_DISABLE);dac_output_buffer_disable(SIN_DAC);/* DAC触发源的选择*/dac_trigger_source_config(SIN_DAC,DAC_TRIGGER_T6_TRGO);/* DAC的DMA功能使能 */dac_dma_enable(SIN_DAC);/* DAC触发使能 */dac_trigger_enable(SIN_DAC);/* enable DAC0 */dac_enable(SIN_DAC);} //DMA配置 static void sin_dma_config(void) {dma_parameter_struct dma_init_struct;/* enable DMA CLK */rcu_periph_clock_enable(SIN_DMA_CLK);/* deinitialize DMA channel3(USART0 tx) */dma_deinit(SIN_DMA, SIN_DMA_CHANNEL);dma_init_struct.direction DMA_MEMORY_TO_PERIPHERAL; // dma_init_struct.memory_addr ;dma_init_struct.memory_inc DMA_MEMORY_INCREASE_ENABLE;dma_init_struct.memory_width DMA_MEMORY_WIDTH_16BIT; // dma_init_struct.number ; // dma_init_struct.periph_addr ;dma_init_struct.periph_inc DMA_PERIPH_INCREASE_DISABLE;dma_init_struct.periph_width DMA_PERIPHERAL_WIDTH_16BIT;dma_init_struct.priority DMA_PRIORITY_ULTRA_HIGH;dma_init(SIN_DMA, SIN_DMA_CHANNEL, dma_init_struct);/* configure DMA mode */dma_memory_to_memory_disable(SIN_DMA, SIN_DMA_CHANNEL); }void sin_config(void) {//引脚配置sin_dac_gpio_config();//通道配置sin_adc_channel_config();//DMA配置sin_dma_config(); }void sin_dma_function_config(void) { //DMAx的通道y的存储器基地址配置dma_memory_address_config(SIN_DMA,SIN_DMA_CHANNEL,(uint32_t)Sine);//配置DMAx通道y还有多少数据要传输dma_transfer_number_config(SIN_DMA,SIN_DMA_CHANNEL,ARRAYNUM(Sine));//DMAx的通道y的外设基地址配置dma_periph_address_config(SIN_DMA,SIN_DMA_CHANNEL,DAC0_R12DH_ADDRESS);//DMA循环模式开启dma_circulation_enable(SIN_DMA, SIN_DMA_CHANNEL);//DMA的通道使能dma_channel_enable(SIN_DMA, SIN_DMA_CHANNEL); }/*TIMx触发配置*/ void sin_timx_trigger_function_config(void) {timer_parameter_struct timer_initpara;rcu_periph_clock_enable(SIN_TIM_CLK);timer_deinit(SIN_TIM);/* TIMER6 configuration */timer_initpara.prescaler 1-1;//预分频timer_initpara.counterdirection TIMER_COUNTER_UP;//向上计数timer_initpara.period 225-1;//定时周期timer_init(SIN_TIM,timer_initpara);//定时器主输出触发源选择timer_master_output_trigger_source_select(SIN_TIM,TIMER_TRI_OUT_SRC_UPDATE);//定时器更新事件使能timer_update_event_enable(SIN_TIM); }/*操作函数*/ void sin_app(void) {//*配置*/sin_config();//DMA功能配置sin_dma_function_config();// TIMER触发功能配置sin_timx_trigger_function_config();// TIMER启动timer_enable(SIN_TIM);} bsp_dac.h文件 #include gd32f30x.hvoid sin_app(void);
http://www.yutouwan.com/news/400524/

相关文章:

  • 泰安做网站收录快的门户网站
  • 网站源码上传完后怎么做南京网站搜索引擎优化
  • 时空网站建设的可行性分析石家庄做网站seo
  • 商标设计网站哪个好网站 建设原则
  • 诸城网站制作运动鞋网站建设目的
  • 商城网站开发价格做的网站怎么放视频
  • 邯郸网站建设地方我的网站不做推广 百度能搜索到我网站吗
  • 什么是网站4mm钢筋网片价格
  • 国开行网站毕业申请怎么做成品源码1277
  • 怎样编辑网站标题注册新公司网上核名网站
  • 科技部网站公布首批创新型县(市)建设名单湘西网站建设花垣
  • 要想让别人网站卖我的东西怎么做tp5.1做的网站
  • 临海手机网站seo网络营销外包公司
  • 这么建设新的网站公司用的管理系统
  • 杭州百度做网站多少钱做网站虚拟主机价格
  • 专业设计自学网站网络热词英语
  • 网站建设一站式服务公司浦东网站制作
  • 网站建设时间动画设计的类型有哪些
  • 网站建设对比分析电影网站如何做seo排名
  • 桂林市建设工程造价管理站网站工程公司简介模板
  • 网络哪里能接活做网站网站搭建收费参考
  • 临沂360网站建设推广帝国cms网站制作
  • oa网站开发模板wordpress 文章章节开发
  • wordpress能做手机站么横岗网站建设公司
  • 做三个月网站广告收入建设银行网站账号怎么注销
  • 做网站销售的换工作线上店免费推广的软件
  • 马鞍山网站设计价格单位网站建设申请
  • 网站域名提交网站开发简历的项目经验
  • 做磨砂卡贴的网站怎么搭建自己的服务器
  • 网站cdn加速怎么入侵电子工程网 单片机