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 }

 

posted @ 2020-03-05 13:03  kingboy100  阅读(645)  评论(0编辑  收藏  举报