STM8L探索套件学习笔记-信号发生器(十四)
时间:11-24
来源:互联网
点击:
STM8L有一个DAC通道,能够将数字信号转为模拟信号。官方范例中使用DAC和DMA、TIM4作为一个信号发生器,首先先逐个介绍下每个功能:
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 andDAC 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)
{
}
}
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 andDAC 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探索套件学习笔记信号发生 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)