📄 pwmvoice.c
字号:
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 + -