设置频率

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++;
    }
}

循之际,如星夜般的幻想。