这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
icore3l_arm_12 [2020/11/18 09:58] zgf |
icore3l_arm_12 [2022/03/19 11:00] (当前版本) sean |
||
---|---|---|---|
行 2: | 行 2: | ||
|技术支持电话|**0379-69926675-801** ||| | |技术支持电话|**0379-69926675-801** ||| | ||
|技术支持邮件|Gingko@vip.163.com ||| | |技术支持邮件|Gingko@vip.163.com ||| | ||
- | |技术论坛|http://www.eeschool.org ||| | ||
^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ||
| V1.0 | 2020-11-18 | gingko | 初次建立 | | | V1.0 | 2020-11-18 | gingko | 初次建立 | | ||
行 15: | 行 14: | ||
{{ :icore3l:icore3l_cube_12_4.png |}} | {{ :icore3l:icore3l_cube_12_4.png |}} | ||
{{ :icore3l:icore3l_cube_12_5.png |}} | {{ :icore3l:icore3l_cube_12_5.png |}} | ||
- | 5.将PI3,PI4,PH14设置为GPIO_Output,PG9设置为GPIO_Input | + | 5.将PI3,PI4,PH14设置为GPIO_Output |
{{ :icore3l:icore3l_cube_12_6.png |}} | {{ :icore3l:icore3l_cube_12_6.png |}} | ||
引脚模式配置 | 引脚模式配置 | ||
- | {{ :icore3l:icore3l_cube_12_7.jpg |}} | + | {{ :icore3l:icore3l_cube_12_7.png |}} |
6.配置DAC | 6.配置DAC | ||
{{ :icore3l:icore3l_cube_12_8.png |}} | {{ :icore3l:icore3l_cube_12_8.png |}} | ||
行 24: | 行 23: | ||
{{ :icore3l:icore3l_cube_12_9.png |}} | {{ :icore3l:icore3l_cube_12_9.png |}} | ||
定时器中断使能 | 定时器中断使能 | ||
- | {{ :icore3l:icore3l_cube_12_10.jpg |}} | + | {{ :icore3l:icore3l_cube_12_10.png |}} |
8.配置SD卡 | 8.配置SD卡 | ||
{{ :icore3l:icore3l_cube_12_11.png |}} | {{ :icore3l:icore3l_cube_12_11.png |}} | ||
行 47: | 行 46: | ||
* **Add necessary library files as reference in the toolchain project configuration file** | * **Add necessary library files as reference in the toolchain project configuration file** | ||
* **不复制文件,直接从软件包存放位置导入.C和.H** | * **不复制文件,直接从软件包存放位置导入.C和.H** | ||
- | * 优点:体积小,比较节约硬盘空间 | + | * 优点:体积小,比较节约硬盘空间 |
- | * 缺点:复制到其他电脑上或者软件包位置改变,就需要修改相对应的路径自行选择方式即可 | + | * 缺点:复制到其他电脑上或者软件包位置改变,就需要修改相对应的路径 |
+ | * 自行选择方式即可 | ||
13.然后点击GENERATE CODE创建工程 | 13.然后点击GENERATE CODE创建工程 | ||
{{ :icore3l:icore3l_cube_12_17.png |}} | {{ :icore3l:icore3l_cube_12_17.png |}} | ||
行 65: | 行 65: | ||
==== 二、实验设备及平台 ==== | ==== 二、实验设备及平台 ==== | ||
- iCore3L 双核心板 | - iCore3L 双核心板 | ||
- | - iCore3L 扩展底板 | ||
- JLINK(或相同功能)仿真器 | - JLINK(或相同功能)仿真器 | ||
- Micro USB线缆 | - Micro USB线缆 | ||
行 140: | 行 139: | ||
== 4.1 什么是频率 == | == 4.1 什么是频率 == | ||
频率是指单位时间内某事件重复的次数。在电子学中,信号的频率是指单位时间内信号的周期数,单位是赫兹(Hertz,简称Hz)。很多年前有一个著名的德国物理学家海因里希· 鲁道夫·赫兹,他首先证明了电磁波的存在,为了纪念他,频率的单位就用他的名字命名。频率是一个非常常用、也是一个非常重要的国际单位;日常生活中,我们收听的收音机、观看的电视机、交流市电、移动蜂窝电话等信号的传输过程,都利用了信号的频率特性。频率与信号的周期互为倒数关系,所以频率也可以表示为: | 频率是指单位时间内某事件重复的次数。在电子学中,信号的频率是指单位时间内信号的周期数,单位是赫兹(Hertz,简称Hz)。很多年前有一个著名的德国物理学家海因里希· 鲁道夫·赫兹,他首先证明了电磁波的存在,为了纪念他,频率的单位就用他的名字命名。频率是一个非常常用、也是一个非常重要的国际单位;日常生活中,我们收听的收音机、观看的电视机、交流市电、移动蜂窝电话等信号的传输过程,都利用了信号的频率特性。频率与信号的周期互为倒数关系,所以频率也可以表示为: | ||
- | {{ :icore3l:icore3l_arm_hal_12_7.png |}} | + | {{ :icore3l:icore3l_arm_hal_12_7.jpg |}} |
== 4.2 怎么得到任意频率的信号 == | == 4.2 怎么得到任意频率的信号 == | ||
* 既然信号的频率特性那么重要,我们怎么样才能得到自己想要的频率的信号呢?一般来说,我们通过下面三种方法得到想要的频率信号。 | * 既然信号的频率特性那么重要,我们怎么样才能得到自己想要的频率的信号呢?一般来说,我们通过下面三种方法得到想要的频率信号。 | ||
行 156: | 行 155: | ||
{{ :icore3l:icore3l_arm_hal_12_9.jpg |}} | {{ :icore3l:icore3l_arm_hal_12_9.jpg |}} | ||
* 如果把调谐字(TUNING WORD)设置为最小值1,带入方程式(2)则可得到最小输出频率,也就是频率分辨率。通过公式(3)我们可以看出,相位累加器位数越高,则频率分辨率越高。在100MHz的采样时钟下,48位的相位累加器可以使得频率分辨率优于 1μHz。 | * 如果把调谐字(TUNING WORD)设置为最小值1,带入方程式(2)则可得到最小输出频率,也就是频率分辨率。通过公式(3)我们可以看出,相位累加器位数越高,则频率分辨率越高。在100MHz的采样时钟下,48位的相位累加器可以使得频率分辨率优于 1μHz。 | ||
- | {{ :icore3l:icore3l_arm_hal_12_10.png |}} | + | {{ :icore3l:icore3l_arm_hal_12_10.jpg |}} |
** 4.4.2 角度-幅度转换** | ** 4.4.2 角度-幅度转换** | ||
* 相位累加器的输出为线性的,如果我们需要输出任意的波形,我们则需要角度-幅度转换。一般地可以通过查找表的方法来实现。相位累加器的输出作为查找表的地址,数据线作为内容输出,则完成了角度-幅度转换。图四示意图为单周期正弦波查找表,n位的相位累加器输出(线性变化)作为查找表的地址线,数据输出端则为按正弦规律变化的数字序列。 | * 相位累加器的输出为线性的,如果我们需要输出任意的波形,我们则需要角度-幅度转换。一般地可以通过查找表的方法来实现。相位累加器的输出作为查找表的地址,数据线作为内容输出,则完成了角度-幅度转换。图四示意图为单周期正弦波查找表,n位的相位累加器输出(线性变化)作为查找表的地址线,数据输出端则为按正弦规律变化的数字序列。 | ||
行 217: | 行 216: | ||
wave.accumulator = 0; | wave.accumulator = 0; | ||
wave.fword = (int)(freq * 4294.967296 * 2.5); | wave.fword = (int)(freq * 4294.967296 * 2.5); | ||
- | return 0; | + | return 0; |
} | } | ||
</code> | </code> | ||
+ | 3.HAL_DAC_SetValue函数 | ||
+ | <code c> | ||
+ | HAL_DAC_SetValue(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data) | ||
+ | //hdac:指向DAC_HandleTypeDef结构的指针 | ||
+ | //Channel:选定DAC通道 | ||
+ | //Alignment:数据对方方式 | ||
+ | //Data:放入寄存器中的值 | ||
+ | </code> | ||
+ | 4.DAC初始化函数 | ||
+ | <code c> | ||
+ | void MX_DAC1_Init(void) | ||
+ | { | ||
+ | DAC_ChannelConfTypeDef sConfig = {0}; | ||
+ | hdac1.Instance = DAC1; | ||
+ | if (HAL_DAC_Init(&hdac1) != HAL_OK) | ||
+ | { | ||
+ | Error_Handler(); | ||
+ | } | ||
+ | sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;//关闭 | ||
+ | sConfig.DAC_Trigger = DAC_TRIGGER_NONE;//关闭DAC触发 | ||
+ | sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;//使用输出缓存,提高驱动力 | ||
+ | sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE;//关闭DAC芯片连接 | ||
+ | sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;//缓冲器偏移校准采用出厂修整 | ||
+ | if (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK) | ||
+ | { | ||
+ | Error_Handler(); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | ==== 五、实验步骤 ==== | ||
+ | |||
+ | - 把仿真器与iCore3L的SWD调试口相连(直接相连或者通过转接器相连); | ||
+ | - 将iCore3L与扩展底板相连,为扩展板供电; | ||
+ | - 打开Keil MDK 开发环境,并打开本实验工程; | ||
+ | - 烧写程序到iCore3L上; | ||
+ | - 也可以进入Debug 模式,单步运行或设置断点验证程序逻辑。 | ||
+ | ==== 六、实验现象 ==== | ||
+ | 用示波器测量iCore3L底板的DAC引脚(PA4)可以看到2Vpp 1KHz的正弦波,如下图。 | ||
+ | {{ :icore3l:icore3l_arm_hal_12_13.jpg |}} |