设置频率
SetSysClock(CLK_SOURCE_PLL_60MHz);
// CLK_SOURCE_PLL_80MHz
// CLK_SOURCE_PLL_60MHz
// CLK_SOURCE_PLL_48MHz
// CLK_SOURCE_PLL_40MHz
// CLK_SOURCE_PLL_36_9MHz
// CLK_SOURCE_PLL_32MHz
// CLK_SOURCE_PLL_30MHz
// CLK_SOURCE_PLL_24MHz
// CLK_SOURCE_PLL_20MHz
// CLK_SOURCE_PLL_15MHz
GPIO操作
函数前的GPIOA表示操作GPIOA组引脚,函数前的GPIOB表示操作GPIOB组引脚。
初始化:
GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeOut_PP_5mA);//初始化A8引脚
GPIO_ModeIN_Floating, //浮空输入
GPIO_ModeIN_PU, //上拉输入 、
GPIO_ModeIN_PD, //下拉输入
GPIO_ModeOut_PP_5mA, //推挽输出最大5mA
GPIO_ModeOut_PP_20mA, //推挽输出最大20mA
GPIOA_ResetBits(GPIO_Pin_8); //拉高引脚
GPIOA_SetBits(GPIO_Pin_8); //拉低引脚
GPIOA_InverseBits(GPIO_Pin_8); //翻转引脚
GPIOA_ReadPortPin(GPIO_Pin_4); //读取引脚输入
串口操作
串口初始化
/* 配置串口1:先配置IO口模式,再配置串口 */
GPIOA_SetBits(GPIO_Pin_9);
GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU); // RXD-配置上拉输入
GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出,注意先让IO口输出高电平
UART1_DefInit();
串口操作:
uint8_t TxBuff[] = "This is a tx exam\r\n";
UART1_SendString(TxBuff, sizeof(TxBuff)); //串口发送
//查询方式获取串口
while(1)
{
len = UART1_RecvString(RxBuff);
if(len)
{
// 处理
}
}
//中断方式获取
主函数:
UART1_ByteTrigCfg(UART_7BYTE_TRIG);
trigB = 7;
UART1_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT);
PFIC_EnableIRQ(UART1_IRQn);
/*********************************************************************
* @fn UART1_IRQHandler
*
* @brief UART1中断函数
*
* @return none
*/
__INTERRUPT
__HIGH_CODE
void UART1_IRQHandler(void)
{
volatile uint8_t i;
switch(UART1_GetITFlag())
{
case UART_II_LINE_STAT: // 线路状态错误
{
UART1_GetLinSTA();
break;
}
case UART_II_RECV_RDY: // 数据达到设置触发点
for(i = 0; i != trigB; i++)
{
RxBuff[i] = UART1_RecvByte();
UART1_SendByte(RxBuff[i]);
}
break;
case UART_II_RECV_TOUT: // 接收超时,暂时一帧数据接收完成
i = UART1_RecvString(RxBuff);
UART1_SendString(RxBuff, i); // 处理数据
break;
case UART_II_THR_EMPTY: // 发送缓存区空,可继续发送
break;
case UART_II_MODEM_CHG: // 只支持串口0
break;
default:
break;
}
}
ADC
内部温度传感器:
ADC_InterTSSampInit(); // 初始化ADC内部温度传感器采样
while(1)
{
uint16_t adcNum = ADC_ExcutSingleConver(); // 执行一次ADC转换并获取结果
PRINT("%d \n", adc_to_temperature_celsius(adcNum)); // 将ADC采样值转换为摄氏温度并打印
mDelaymS(500);
}
单通道采样:
GPIOA_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_Floating); // 配置PA4为浮空输入,用于ADC单通道采样
ADC_ExtSingleChSampInit(SampleFreq_3_2, ADC_PGA_0); // 初始化ADC单端通道采样,采样频率为3.2MHz,PGA增益为0
RoughCalib_Value = ADC_DataCalib_Rough(); // 用于计算ADC内部偏差,记录到全局变量 RoughCalib_Value中
PRINT("内部偏差值 =%d \n", RoughCalib_Value);
ADC_ChannelCfg(0); // 配置ADC通道0进行采样
while (1)
{
uint16_t adcNum = ADC_ExcutSingleConver() + RoughCalib_Value; // 执行一次ADC转换并获取结果,添加粗调偏差值
PRINT("%d \n", adcNum); // 注意:由于ADC内部偏差的存在,当采样电压在所选增益范围极限附近的时候,可能会出现数据溢出的现象
mDelaymS(500);
}
DMA单通道采样:
/* DMA单通道采样:选择adc通道0做采样,对应 PA4引脚 */
uint16_t adcBuff[40]; // 用于存储DMA采样数据
volatile uint8_t DMA_end = 0; // DMA采样结束标志
GPIOA_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_Floating); // 配置PA4为浮空输入,用于ADC单通道采样
ADC_ExtSingleChSampInit(SampleFreq_3_2, ADC_PGA_0); // 初始化ADC单端通道采样,采样频率为3.2MHz,PGA增益为0
ADC_ChannelCfg(0); // 配置ADC通道0进行采样
ADC_AutoConverCycle(192); // 采样周期为 (256-192)*16个系统时钟
ADC_DMACfg(ENABLE, (uint16_t)(uint32_t)&adcBuff[0], (uint16_t)(uint32_t)&adcBuff[40], ADC_Mode_Single); // 配置DMA采样,使用单通道模式,数据存储在adcBuff数组中
PFIC_EnableIRQ(ADC_IRQn); // 使能ADC中断
ADC_StartDMA(); // 启动DMA采样
while(!DMA_end); // 等待DMA采样完成
DMA_end = 0; // 重置DMA结束标志
ADC_DMACfg(DISABLE, 0, 0, 0); // 禁用DMA采样
for(i = 0; i < 40; i++)
{
PRINT("%d \n", adcBuff[i]);
}
差分通道采样:
/* 差分通道采样:选择adc通道0做采样,对应 PA4(AIN0)、PA12(AIN2) */
GPIOA_ModeCfg(GPIO_Pin_4 | GPIO_Pin_12, GPIO_ModeIN_Floating); // 配置PA4和PA12为浮空输入,用于ADC差分通道采样
ADC_ExtDiffChSampInit(SampleFreq_3_2, ADC_PGA_0); // 初始化ADC差分通道采样,采样频率为3.2MHz,PGA增益为0
ADC_ChannelCfg(0); // 配置ADC通道0进行采样
while (1)
{
uint16_t adcNum = ADC_ExcutSingleConver(); // 执行一次ADC转换并获取结果
PRINT("%d \n", adcNum);
}
TouchKey采样:
GPIOA_ModeCfg(GPIO_Pin_12, GPIO_ModeIN_Floating); // 配置PA12为浮空输入,用于TouchKey采样
TouchKey_ChSampInit(); // 初始化TouchKey采样
ADC_ChannelCfg(2); // 配置ADC通道2进行采样
while (1)
{
uint16_t adcNum = TouchKey_ExcutSingleConver(0x10, 0); // 执行一次TouchKey转换并获取结果,0x10为采样次数,0为校准值
PRINT("%d \n", adcNum);
mDelaymS(500);
}
单通道采样:
volatile uint8_t adclen; // 采样长度计数器,全局变量
/* 单通道采样:中断方式,选择adc通道1做采样,对应 PA5引脚, 不带数据校准功能 */
GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_Floating); // 配置PA5为浮空输入,用于ADC单通道采样(中断方式)
ADC_ExtSingleChSampInit(SampleFreq_3_2, ADC_PGA_0); // 初始化ADC单端通道采样,采样频率为3.2MHz,PGA增益为0
ADC_ChannelCfg(1); // 配置ADC通道1进行采样
adclen = 0; // 初始化采样长度计数器
ADC_ClearITFlag(); // 清除ADC中断标志
PFIC_EnableIRQ(ADC_IRQn); // 使能ADC中断
ADC_StartUp(); // 启动ADC采样,开始中断采样
while(adclen < 20); // 等待采样完成,直到采样长度达到20
PFIC_DisableIRQ(ADC_IRQn); // 禁用ADC中断
for(i = 0; i < 20; i++)
{
PRINT("%d \n", adcBuff[i]);
}
/*********************************************************************
* @fn ADC_IRQHandler
*
* @brief ADC中断函数
*
* @return none
*/
__INTERRUPT
__HIGH_CODE
void ADC_IRQHandler(void) //adc中断服务程序
{
if(ADC_GetDMAStatus())
{
ADC_StopDMA();
R16_ADC_DMA_BEG = ((uint32_t)adcBuff) & 0xffff;
ADC_ClearDMAFlag();
DMA_end = 1;
}
if(ADC_GetITStatus())
{
ADC_ClearITFlag();
if(adclen < 20)
{
adcBuff[adclen] = ADC_ReadConverValue();
ADC_StartUp(); // 作用清除中断标志并开启新一轮采样
}
adclen++;
}
}
Comments | NOTHING