DMA用于提供外设与内存或者内存与内存的高速数据传递,数据能够直接由DMA移动,而无需CPU操作,这样能够使得CPU的资源可以用于其他操作。DMA控制器有4个通道,每个通道用于管理一个或者多个外设的内存访问请求。内部有仲裁管理DMA访问的优先权。由于是8位,DMA最大数据量为255。
DAC模块是12比特数模转换器电压输出,DAC能够配置为8比特或者12比特模式,能够使用DMA控制器。在12比特模式下,数据可以选择左/右对齐,在中等模式器件下有1个输出通道,在中等+和高密度器件有2个输出通道。输入内部参考电压VREF可以获得更好的角度。
DAC可以配置为软件触发和TIM4外部触发模式,我们使用TIM4外部触发模式可以方便地调整输出频率。官方例程使用寄存器操作,比较难懂。这里我们使用固件库先创建一个简单地信号发生器,能够选择生成信号的类型,并使用板上的LCD显示信号的名称。
代码如下:
void main(void)
{
//CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);//系统1分频,16M
/* Enable Clocks of DAC, TIM4 and DMA1 */
CLK_PeripheralClockConfig(CLK_Peripheral_DAC, ENABLE);
CLK_PeripheralClockConfig(CLK_Peripheral_TIM4, ENABLE);
CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);
LCD_GLASS_Init();
/* DMA channel3 Config -----------------------------------------------------------------*/
DMA_GlobalDeInit();
DMA_DeInit(DMA1_Channel3);
DMA_Init(DMA1_Channel3, WavesTab[0], DAC_CH1RDHRH_ADDRESS,
130, DMA_DIR_MemoryToPeripheral, DMA_Mode_Circular,
DMA_MemoryIncMode_Inc, DMA_Priority_High, DMA_MemoryDataSize_HalfWord);
/* DMA1 Channel 3 enable */
DMA_Cmd(DMA1_Channel3, ENABLE);
DMA_GlobalCmd(ENABLE);
/* DAC Channel1 Config: 12bit right-----------------------------------------------------*/
/* DAC deinitialize */
DAC_DeInit();
/* Fill DAC Init param DAC_Trigger_T4_TRGO and DAC Channel1 Init */
DAC_Init(DAC_Channel_1, DAC_Trigger_T4_TRGO, DAC_OutputBuffer_Enable);
/* Enable DAC Channel1 */
DAC_Cmd(DAC_Channel_1, ENABLE);
/* Enable DMA for DAC Channel1 */
DAC_DMACmd(DAC_Channel_1, ENABLE);
/********* TIM4 Config ********/
/* TIM4 Configuration */
TIM4_DeInit();
/* Time base configuration */
TIM4_TimeBaseInit(TIM4_Prescaler_16, 0xFF);
/* TIM4 TRGO selection */
TIM4_SelectOutputTrigger(TIM4_TRGOSource_Update);
/* TIM4 enable counter */
TIM4_Cmd(ENABLE);
/* Init Eval Board used Buttons*/
GPIO_Init(KEY_PORT,KEY_PIN,GPIO_Mode_In_FL_IT);
//输入浮空-中断
/* Set PC1 sensitivity to falling edge and low level 下降沿低电平触发*/
EXTI_SetPinSensitivity(EXTI_Pin_1, EXTI_Trigger_Falling_Low);
/* Set the EXTI1 IRQ (which is connected to key button) level to 1 */
ITC_SetSoftwarePriority(EXTI1_IRQn, ITC_PriorityLevel_1);
/* enable interrupts by setting level 0 */
enableInterrupts();
LCD_GLASS_DisplayString("TRIANG");
BAR_ALL_OFF;
/* Infinite loop */
while (1)
{
}
}
上一篇:STM8L探索套件学习笔记-ADC_DMA(十五)
下一篇:STM8L探索套件学习笔记-AES硬件加密(十三)
推荐阅读最新更新时间:2024-03-16 14:40
设计资源 培训 开发板 精华推荐
- Allegro MicroSystems 在 2024 年德国慕尼黑电子展上推出先进的磁性和电感式位置感测解决方案
- 左手车钥匙,右手活体检测雷达,UWB上车势在必行!
- 狂飙十年,国产CIS挤上牌桌
- 神盾短刀电池+雷神EM-i超级电混,吉利新能源甩出了两张“王炸”
- 浅谈功能安全之故障(fault),错误(error),失效(failure)
- 智能汽车2.0周期,这几大核心产业链迎来重大机会!
- 美日研发新型电池,宁德时代面临挑战?中国新能源电池产业如何应对?
- Rambus推出业界首款HBM 4控制器IP:背后有哪些技术细节?
- 村田推出高精度汽车用6轴惯性传感器
- 福特获得预充电报警专利 有助于节约成本和应对紧急情况