STM8L探索套件學(xué)習(xí)筆記-信號(hào)發(fā)生器(十四)
DMA用于提供外設(shè)與內(nèi)存或者內(nèi)存與內(nèi)存的高速數(shù)據(jù)傳遞,數(shù)據(jù)能夠直接由DMA移動(dòng),而無需CPU操作,這樣能夠使得CPU的資源可以用于其他操作。DMA控制器有4個(gè)通道,每個(gè)通道用于管理一個(gè)或者多個(gè)外設(shè)的內(nèi)存訪問請(qǐng)求。內(nèi)部有仲裁管理DMA訪問的優(yōu)先權(quán)。由于是8位,DMA最大數(shù)據(jù)量為255。
DAC模塊是12比特數(shù)模轉(zhuǎn)換器電壓輸出,DAC能夠配置為8比特或者12比特模式,能夠使用DMA控制器。在12比特模式下,數(shù)據(jù)可以選擇左/右對(duì)齊,在中等模式器件下有1個(gè)輸出通道,在中等+和高密度器件有2個(gè)輸出通道。輸入內(nèi)部參考電壓VREF可以獲得更好的角度。
DAC可以配置為軟件觸發(fā)和TIM4外部觸發(fā)模式,我們使用TIM4外部觸發(fā)模式可以方便地調(diào)整輸出頻率。官方例程使用寄存器操作,比較難懂。這里我們使用固件庫先創(chuàng)建一個(gè)簡單地信號(hào)發(fā)生器,能夠選擇生成信號(hào)的類型,并使用板上的LCD顯示信號(hào)的名稱。
代碼如下:
void main(void)
{
//CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);//系統(tǒng)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下降沿低電平觸發(fā)*/
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)
{
}
}
評(píng)論