CH579-UART1 & ADC
Uart1
1 /********************************** (C) COPYRIGHT ******************************* 2 * File Name : Main.c 3 * Author : WCH 4 * Version : V1.0 5 * Date : 2018/12/15 6 * Description : 串口1收发演示 7 *******************************************************************************/ 8 9 #include "CH57x_common.h" 10 11 12 UINT8 TxBuff[]="This is a tx exam\r\n"; 13 UINT8 RxBuff[100]; 14 UINT8 trigB; 15 16 17 int main() 18 { 19 UINT8 len; 20 21 /* 配置串口1:先配置IO口模式,再配置串口 */ 22 GPIOA_SetBits(GPIO_Pin_9); 23 GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU); // RXD-配置上拉输入 24 GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出,注意先让IO口输出高电平 25 UART1_DefInit(); 26 27 #if 1 // 测试串口发送字符串 28 UART1_SendString( TxBuff, sizeof(TxBuff) ); 29 30 #endif 31 32 #if 1 // 查询方式:接收数据后发送出去 33 while(1) 34 { 35 len = UART1_RecvString(RxBuff); 36 if( len ) 37 { 38 UART1_SendString( RxBuff, len ); 39 } 40 } 41 42 #endif 43 44 #if 0 // 中断方式:接收数据后发送出去 45 UART1_ByteTrigCfg( UART_7BYTE_TRIG ); 46 trigB = 7; 47 UART1_INTCfg( ENABLE, RB_IER_RECV_RDY|RB_IER_LINE_STAT ); 48 NVIC_EnableIRQ( UART1_IRQn ); 49 #endif 50 51 while(1); 52 } 53 54 55 void UART1_IRQHandler(void) 56 { 57 UINT8 i; 58 59 switch( UART1_GetITFlag() ) 60 { 61 case UART_II_LINE_STAT: // 线路状态错误 62 UART1_GetLinSTA(); 63 break; 64 65 case UART_II_RECV_RDY: // 数据达到设置触发点 66 for(i=0; i!=trigB; i++) 67 { 68 RxBuff[i] = UART1_RecvByte(); 69 UART1_SendByte(RxBuff[i]); 70 } 71 break; 72 73 case UART_II_RECV_TOUT: // 接收超时,暂时一帧数据接收完成 74 i = UART1_RecvString(RxBuff); 75 UART1_SendString( RxBuff, i ); 76 break; 77 78 case UART_II_THR_EMPTY: // 发送缓存区空,可继续发送 79 break; 80 81 case UART_II_MODEM_CHG: // 只支持串口0 82 break; 83 84 default: 85 break; 86 } 87 }
ADC
1 /********************************** (C) COPYRIGHT ******************************* 2 * File Name : Main.c 3 * Author : WCH 4 * Version : V1.0 5 * Date : 2018/12/15 6 * Description : adc采样示例,包括温度检测、单通道检测、差分通道检测、TouchKey检测、中断方式采样。 7 *******************************************************************************/ 8 9 #include "CH57x_common.h" 10 11 12 UINT16 abcBuff[40]; 13 volatile UINT8 adclen; 14 15 void DebugInit(void) 16 { 17 GPIOA_SetBits(GPIO_Pin_9); 18 GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU); 19 GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA); 20 UART1_DefInit(); 21 } 22 23 int main() 24 { 25 UINT8 i; 26 signed short RoughCalib_Value=0;// ADC粗调偏差值 27 28 /* 配置串口调试 */ 29 DebugInit(); 30 PRINT( "Start @ChipID=%02X\n", R8_CHIP_ID ); 31 32 /* 温度采样并输出, 包含数据粗校准 */ 33 PRINT( "\n1.Temperature sampling...\n"); 34 ADC_InterTSSampInit(); 35 RoughCalib_Value = ADC_DataCalib_Rough(); // 用于计算ADC内部偏差,记录到变量 RoughCalib_Value中,注意这个变量需要定义为有符号变量 36 for(i=0; i<20; i++) 37 { 38 abcBuff[i] = ADC_ExcutSingleConver() + RoughCalib_Value;// 连续采样20次 39 } 40 for(i=0; i<20; i++) 41 { 42 PRINT("%d ", abcBuff[i]); 43 }PRINT("\n"); 44 45 /* 单通道采样:选择adc通道9做采样,对应 PA0引脚, 带数据校准功能 */ 46 PRINT( "\n2.Single channel sampling...\n"); 47 GPIOA_ModeCfg(GPIO_Pin_0, GPIO_ModeIN_Floating); 48 ADC_ExtSingleChSampInit( SampleFreq_3_2, ADC_PGA_0 ); 49 50 /* 51 注意:数据校准包括 粗调和细调: 52 ADC_DataCalib_Rough() 是粗调函数,调用前需保证PA5引脚配置浮空输入模式,外部没有电压信号,在ADC初始化之后调用,一般调用一次,除非更改了ADC模式(增益改变) 53 ADC_DataCalib_Fine() 是细调函数,对于粗调过的数据进行拟合算法运算,得到更精确数据 54 */ 55 GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_Floating); 56 RoughCalib_Value = ADC_DataCalib_Rough(); // 用于计算ADC内部偏差,记录到全局变量 RoughCalib_Value中 57 PRINT("=%d \n", RoughCalib_Value); 58 59 ADC_ChannelCfg( 9 ); 60 for(i=0; i<20; i++) 61 { 62 abcBuff[i] = ADC_ExcutSingleConver() + RoughCalib_Value;// 连续采样20次 63 ADC_DataCalib_Fine( &abcBuff[i], ADC_PGA_0 ); 64 } 65 for(i=0; i<20; i++) 66 { 67 PRINT("%d ", abcBuff[i]); 68 }PRINT("\n"); 69 70 /* 差分通道采样:选择adc通道0做采样,对应 PA4(AIN0)、PA12(AIN2) */ 71 PRINT( "\n3.Diff channel sampling...\n"); 72 GPIOA_ModeCfg(GPIO_Pin_4|GPIO_Pin_12, GPIO_ModeIN_Floating); 73 ADC_ExtDiffChSampInit( SampleFreq_3_2, ADC_PGA_0 ); 74 ADC_ChannelCfg( 0 ); 75 for(i=0; i<20; i++) 76 { 77 abcBuff[i] = ADC_ExcutSingleConver();// 连续采样20次 78 } 79 for(i=0; i<20; i++) 80 { 81 PRINT("%d ", abcBuff[i]); 82 }PRINT("\n"); 83 84 /* TouchKey采样:选择adc通道 2 做采样,对应 PA12 */ 85 PRINT( "\n4.TouchKey sampling...\n"); 86 GPIOA_ModeCfg(GPIO_Pin_12, GPIO_ModeIN_Floating); 87 TouchKey_ChSampInit(); 88 ADC_ChannelCfg( 2 ); 89 90 for(i=0; i<20; i++) 91 { 92 abcBuff[i] = TouchKey_ExcutSingleConver(0x20);// 连续采样20次 93 } 94 for(i=0; i<20; i++) 95 { 96 PRINT("%d ", abcBuff[i]); 97 }PRINT("\n"); 98 99 100 /* 单通道采样:中断方式,选择adc通道1做采样,对应 PA5引脚, 不带数据校准功能 */ 101 PRINT( "\n5.Single channel sampling in interrupt mode...\n"); 102 GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_Floating); 103 ADC_ExtSingleChSampInit( SampleFreq_3_2, ADC_PGA_0 ); 104 ADC_ChannelCfg( 1 ); 105 NVIC_EnableIRQ(ADC_IRQn); 106 adclen = 0; 107 108 ADC_StartUp(); 109 while(adclen < 20); 110 NVIC_DisableIRQ(ADC_IRQn); 111 for(i=0; i<20; i++) 112 { 113 PRINT("%d ", abcBuff[i]); 114 }PRINT("\n"); 115 116 while(1); 117 } 118 119 120 void ADC_IRQHandler(void)//adc中断服务程序 121 { 122 if(ADC_GetITStatus()) 123 { 124 abcBuff[adclen] = ADC_ReadConverValue(); 125 ADC_StartUp(); // 作用清除中断标志并开启新一轮采样 126 adclen ++; 127 } 128 }