S3C2410X DMA特性与A/D转换器编程指南

需积分: 29 1 下载量 36 浏览量 更新于2024-08-23 收藏 1.78MB PPT 举报
"CURR_SRC---当前数据源地址-ARM三星公司2410讲义PPT" 这篇讲义主要介绍了ARM公司S3C2410X处理器中的关键组件,特别是与数据传输、中断处理、定时器以及脉宽调制(PWM)功能相关的部分。以下是这些知识点的详细说明: 1. DMA(直接存储器访问)特性: S3C2410X具有DMA功能,用于高效的数据传输,不需CPU介入。CURR_SRC是DMA当前数据源地址寄存器,它记录了DMA正在从中读取数据的位置。在每次传输后,地址可能会按1、2或4字节递增,或者保持不变,具体取决于传输模式。当CURR_SRC为0且DMA ACK(中断请求标志)为1时,系统会加载S_ADDR源基地址的值。 2. DMA当前源地址寄存器(DCSRCn): DCSRC0到DCSRC3分别对应DMA通道0至3的当前源地址寄存器,它们都是只读寄存器,存储了每个通道当前的源数据地址。初始值为0x00000000。 3. S3C2410X的存储器结构: 讲义中提到的存储器包括Flash、SRAM等,每个部分都有其特定的特性。存储器控制寄存器用于配置和管理内存访问,如Bank选择、保护区域设置等。 4. Flash特点: S3C2410X的Flash通常用于存储固件和程序代码,具有快速读取、低功耗和非易失性的特点。 5. DMA工作过程及寄存器配置: DMA工作时,会按照预先配置的参数自动从源地址读取数据并写入目标地址,过程中涉及的寄存器包括控制寄存器、源和目标地址寄存器等。 6. A/D转换器(ADC): S3C2410X集成的ADC支持多个模拟输入通道(AIN0-AIN9),有相应的控制寄存器,如ADC控制寄存器,用于启动转换、设置采样时间等。 7. 中断系统: S3C2410X的中断系统是中断处理的核心,它包含中断控制器,具有多级优先级和可编程中断源。相关的寄存器包括中断状态和控制寄存器,用于管理和响应中断请求。 8. 中断控制器工作流程: 当中断发生时,中断控制器会识别中断源,设置中断请求标志,通知CPU,CPU响应后跳转到中断服务程序,执行相应操作。 9. 外部中断EINT0的使用: 使用EINT0进行中断处理,需要对中断系统和相关引脚进行初始化,然后在中断服务程序中处理数据输入。 10. 定时器系统: S3C2410X的定时器系统支持多种计时和定时功能,包括看门狗定时器、普通定时器等,相关的寄存器用于配置定时器的周期和中断触发条件。 11. PWM功能: 脉宽调制功能可用于控制电机速度或其他应用,通过改变脉冲宽度来调整输出信号的平均电压,从而控制设备的工作状态。 12. timer0和timer1的使用: timer0和timer1可以配置为产生不同频率和占空比的方波,用于定时或PWM输出。初始化时需要设置计数模式、预分频器和比较寄存器。 通过上述知识点的学习,开发者可以更好地理解和操作S3C2410X处理器,实现高效的嵌入式系统设计。
2023-06-11 上传
2023-06-11 上传

为什么在下列代码中如何表示与curr_pi与prev_p表示的是同一个点:float smoothCot() { float err = -1; cogs.clear(); v_end = mesh.vertices_end(); // for (v_it = mesh.vertices_begin(); v_it != v_end; ++v_it) { cog[0] = cog[1] = cog[2] = valence = 0.0; //cout << valence<<"1" << endl; for (vv_it = mesh.vv_iter(*v_it); vv_it.is_valid(); ++vv_it) { double cot_weight = 0.0; MyMesh::HalfedgeHandle heh = mesh.find_halfedge(*v_it, *vv_it); if (!mesh.is_boundary(heh)) { MyMesh::HalfedgeHandle prev_heh = mesh.prev_halfedge_handle(heh); MyMesh::HalfedgeHandle next_heh = mesh.next_halfedge_handle(heh); MyMesh::VertexHandle prev_vh = mesh.to_vertex_handle(prev_heh); MyMesh::VertexHandle next_vh = mesh.to_vertex_handle(next_heh); MyMesh::Point prev_p = mesh.point(prev_vh); MyMesh::Point curr_pi = mesh.point(*v_it); MyMesh::Point curr_pj = mesh.point(*vv_it); MyMesh::Point next_p = mesh.point(next_vh); double cot_alpha = cot(curr_pi - prev_p, curr_pj - prev_p); double cot_beta = cot(curr_pi - next_p, curr_pj - next_p); cot_weight = cot_alpha + cot_beta; //cout << cot_weight<<"2" << endl; } cog += cot_weight *( mesh.point(*vv_it)-mesh.point(*v_it)); valence += cot_weight; //cout << valence<<"3" << endl; } cogs.push_back(cog / valence); } for (v_it = mesh.vertices_begin(), cog_it = cogs.begin(); v_it != v_end; ++v_it, ++cog_it) { if (!mesh.is_boundary(*v_it)) { MyMesh::Point p = mesh.point(*v_it); //*cog_it += mesh.point(*v_it); err = max(err, (p - *cog_it).norm()); mesh.set_point(*v_it, *cog_it); } } return err; }

2023-06-11 上传