⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwmvoice.c

📁 PwmVoice(编程器烧写) PwmVoice_Player.ewd
💻 C
📖 第 1 页 / 共 2 页
字号:
    TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);    	          /*  清除定时器0中断                    */
    ADCProcessorTrigger(ADC_BASE, 0);   		          /*  处理器触发采样序列0	         */    
    while( (HWREG(ADC_BASE + ADC_O_X_SSFSTAT) & 0x00000100) );    /*  等待FIFO 0为非空,即等待转换结束   */
    ADCSequenceDataGet(ADC_BASE, 0, &ADData);                     /*  读出10位转换结果                   */
    WrData = (uint8)(ADData/4);                                   /*  将A/D读出的10位数据量化成8位数据   */
    SSTF016B_WR(WrAddr,  WrData);                                 /*  将8位的音频数据写入SSTF016B中      */               
    WrAddr++;                                                     /*  SST016B地址加1                     */
    if (WrAddr == 0x1FFFFF )                                          /*  如果地址存满,结束录音,并点亮LED  */
    {
     WrAddr=0;                                                    /*  地址归0                            */
     GPIOPinWrite(GPIO_PORTA_BASE, LED1, ~LED1);
     GPIOPinWrite(GPIO_PORTC_BASE, LED2, ~LED2);
     GPIOPinWrite(GPIO_PORTC_BASE, LED3, ~LED3);
     GPIOPinWrite(GPIO_PORTC_BASE, LED4, ~LED4); 
     IntDisable(INT_TIMER0A);                                      /*  禁止定时器中断                     */ 
    }
   
    TimerEnable(TIMER0_BASE, TIMER_A);                             /*  使能定时器0                  */
}
/*************************************************************************************************
** 函数名称  Timer1A_ISR
** 函数功能  定时器1中断处理程序。工作在32位周期触发模式下。
** 说明:用KEIL软件时,在Startup.S中添加该中断函数名
** 输入参数  无。
** 输出参数  无。
**************************************************************************************************/
void Timer1A_ISR (void)
{
    TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT);            /*  清除定时器0中断                  */
    SSTF016B_RD(RdAddr, 1, &RdData);                           /*  读出FLASH中地址在RdData的数据    */
    RdDataConvert=RdData*2-20;                                 /*  将读出的数据增大,从而扩大声音,减去一定的直流偏置量   */
    PWMPulseWidthSet(PWM_BASE, PWM_OUT_0, RdDataConvert);       /*  用RdDataConvert来改变PWM波的波形 */                
    RdAddr++;                                                   /*  读地址累加                        */
    if ( RdAddr == WrAddr )                                       /*  读完数据,LED指示               */
    {
     RdAddr = 0;                                                  /*  读地址归0                       */
     GPIOPinWrite(GPIO_PORTA_BASE, LED1, ~LED1);
     GPIOPinWrite(GPIO_PORTC_BASE, LED2, ~LED2);
     GPIOPinWrite(GPIO_PORTC_BASE, LED3, ~LED3);
     GPIOPinWrite(GPIO_PORTC_BASE, LED4, ~LED4); 
     IntDisable(INT_TIMER1A);
    }
    TimerEnable(TIMER0_BASE, TIMER_A);                            /*  使能定时器0                   */
}
/*************************************************************************************************
** 函数名称  GPIO_Init
** 函数功能  初始化GPIO口,包括端口优先级设置,端口方向和触发方式等。
** 输入参数  无。
** 输出参数  无。
**************************************************************************************************/
void GPIO_Init(void)
{
  IntPrioritySet(INT_GPIOD,0x00);                           /*  优先级设置                    */   
  IntPrioritySet(INT_GPIOA,0x40);                
  IntPrioritySet(INT_GPIOC,0x80);  
  
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);              /*  使能GPIO PA口                 */
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);              /*  使能GPIO PB口                 */ 
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);              /*  使能GPIO PC口                 */
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);              /*  使能GPIO PD口                 */
  
  GPIODirModeSet(GPIO_PORTC_BASE, KEY1, GPIO_DIR_MODE_IN);  /*  设置连接KEY1的PC7为输入       */
  GPIODirModeSet(GPIO_PORTA_BASE, KEY2, GPIO_DIR_MODE_IN);  /*  设置连接KEY2的PA1为输入       */
  GPIODirModeSet(GPIO_PORTB_BASE, KEY3, GPIO_DIR_MODE_IN);  /*  设置连接KEY3的PB4为输入       */
  GPIODirModeSet(GPIO_PORTD_BASE, KEY4, GPIO_DIR_MODE_IN);  /*  设置连接KEY3的PD4为输入       */
  GPIODirModeSet(GPIO_PORTA_BASE, LED1, GPIO_DIR_MODE_OUT); /*  设置连接LED1的PA0为输出       */
  GPIODirModeSet(GPIO_PORTC_BASE, LED2, GPIO_DIR_MODE_OUT); /*  设置连接LED2的PC5为输出       */
  GPIODirModeSet(GPIO_PORTC_BASE, LED3, GPIO_DIR_MODE_OUT); /*  设置连接LED3的PC4为输出       */
  GPIODirModeSet(GPIO_PORTC_BASE, LED4, GPIO_DIR_MODE_OUT); /*  设置连接LED4的PC6为输出       */

  GPIOIntTypeSet(GPIO_PORTC_BASE, KEY1, GPIO_LOW_LEVEL);    /*  设置KEY1中断的触发方式为电平触发  */
  GPIOIntTypeSet(GPIO_PORTA_BASE, KEY2, GPIO_LOW_LEVEL);    /*  设置KEY2中断的触发方式为电平触发  */
  GPIOIntTypeSet(GPIO_PORTB_BASE, KEY3, GPIO_LOW_LEVEL);    /*  设置KEY3中断的触发方式为电平触发  */
  GPIOIntTypeSet(GPIO_PORTD_BASE, KEY4, GPIO_LOW_LEVEL);    /*  设置KEY4中断的触发方式为电平触发  */
  
  GPIOPinIntEnable(GPIO_PORTC_BASE, KEY1);                  /*  使能KEY1中断                   */
  GPIOPinIntEnable(GPIO_PORTA_BASE, KEY2);                  /*  使能KEY2中断                   */
  GPIOPinIntEnable(GPIO_PORTB_BASE, KEY3);                  /*  使能KEY3中断                   */
  GPIOPinIntEnable(GPIO_PORTD_BASE, KEY4);                  /*  使能KEY4中断                   */
   
   
}
/*************************************************************************************************
** 函数名称  TIMER_Init
** 函数功能  初始化定时器
** 输入参数  无。
** 输出参数  无。
**************************************************************************************************/
void TIMER_Init(void)
{
  SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);            /*  使能定时器0外设                 */
  SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1);            /*  使能定时器1外设                 */ 
  
  TimerConfigure(TIMER0_BASE,	TIMER_CFG_32_BIT_PER);     /*  设置定时器0为周期触发模式       */
  TimerConfigure(TIMER1_BASE,   TIMER_CFG_32_BIT_PER);     /*  设置定时器1为周期触发模式       */
  TimerLoadSet(TIMER0_BASE, TIMER_A, 1000);                /*  设置定时器装载值:定时1/2秒      */
  TimerLoadSet(TIMER1_BASE, TIMER_A, 1000);                /*  设置定时器装载值:定时1/2秒      */
  TimerIntEnable(TIMER0_BASE,	TIMER_TIMA_TIMEOUT);       /*  设置定时器为溢出中断            */
  TimerIntEnable(TIMER1_BASE,   TIMER_TIMA_TIMEOUT);       /*  设置定时器为溢出中断            */
  TimerEnable(TIMER0_BASE, TIMER_A);                       /*  使能定时器0                     */
  TimerEnable(TIMER1_BASE, TIMER_A);                       /*  使能定时器0                     */
  IntDisable(INT_TIMER0A);                                 /*  禁能定时器0                     */
  IntDisable(INT_TIMER1A);
}
/*************************************************************************************************
** 函数名称  AD_Init
** 函数功能  初始化A/D
** 输入参数  无。
** 输出参数  无。
**************************************************************************************************/
void AD_Init(void)
{
  SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC);                /*  使能ADC模块的时钟               */   					   
  SysCtlADCSpeedSet(SYSCTL_ADCSPEED_1MSPS);  		    /*  1MSps采样率                     */
  ADCSequenceDisable(ADC_BASE, 0);          		     /*  禁能所有采样序列               */
  ADCSequenceConfigure(ADC_BASE, 0, ADC_TRIGGER_PROCESSOR, 0); /*  采样序列0为处理器触发        */
  ADCSequenceStepConfigure(ADC_BASE, 0, 0, ADC_CTL_CH0  | ADC_CTL_END); /*  采样序列0的第0步使用ADC0,完成第0步后结束*/  
  ADCSequenceEnable(ADC_BASE, 0);  			      /*  使能采样序列0                 */
   
}
/*************************************************************************************************
** 函数名称  PWM_Init
** 函数功能  初始化PWM
** 输入参数  无。
** 输出参数  无。
**************************************************************************************************/
void PWM_Init(void)
{
  SysCtlPWMClockSet(SYSCTL_PWMDIV_1);                        /*  PWM时钟源1分频                 */    
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);               /*  使能PD口外设                   */ 
  SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM);                 /*  使能PWM外设                    */
  GPIOPinTypePWM(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1);  /*  设置PD0,PD1为PWM0和PWM1        */
  PWMGenConfigure(PWM_BASE, PWM_GEN_0,			     /*  设置PWM发生器0为上下计数方式,两路PWM不同步 */
                    PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
  PWMGenPeriodSet(PWM_BASE, PWM_GEN_0, 1000); 
   
  PWMOutputState(PWM_BASE, PWM_OUT_0_BIT | PWM_OUT_1_BIT, true);   /*  使能PWM0和PWM1            */
  PWMGenEnable(PWM_BASE, PWM_GEN_0);                               /*  使能PWM发生器0            */  
}
/***********************************************************************************************
** 函数原形:int main(void)
** 功能描述:主函数
** 参数说明:无
** 返回值:0
***********************************************************************************************/
int main(void)
{ 
 
  Go2JTAG();                                               /*  防止JTAG失效                  */
  SysCtlClockSet( SYSCTL_SYSDIV_8 | SYSCTL_USE_PLL | 
                    SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ );  /*  设置系统时钟,系统工作在25M   */ 
  SPI_Init();	                                           /*  SPI总线初始化                 */
  GPIO_Init();                                             /*  初始化GPIO端口                */
  TIMER_Init();                                            /*  初始化TIMER                   */
  AD_Init();                                               /*  初始化A/D                     */
  PWM_Init();                                              /*  初始化PWM                     */
  GPIOPinWrite(GPIO_PORTA_BASE, LED1, LED1);               /*  熄灭所有LED                   */
  GPIOPinWrite(GPIO_PORTC_BASE, LED2, LED2);
  GPIOPinWrite(GPIO_PORTC_BASE, LED3, LED3);
  GPIOPinWrite(GPIO_PORTC_BASE, LED4, LED4); 
  IntEnable(INT_GPIOA);                                    /*  使能GPIO A 口中断             */
  IntEnable(INT_GPIOB);                                    /*  使能GPIO B 口中断             */
  IntEnable(INT_GPIOC);                                    /*  使能GPIO C 口中断             */
  IntEnable(INT_GPIOD);                                    /*  使能GPIO D 口中断             */
  IntMasterEnable();                                       /*  处理器使能。                  */
  while (1);
  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -