{"id":1931,"date":"2025-06-18T16:49:10","date_gmt":"2025-06-18T08:49:10","guid":{"rendered":"https:\/\/www.forillusion.com\/?p=1931"},"modified":"2025-08-21T19:52:12","modified_gmt":"2025-08-21T11:52:12","slug":"ch582m-basic-operation","status":"publish","type":"post","link":"https:\/\/www.forillusion.com\/index.php\/ch582m-basic-operation\/","title":{"rendered":"CH582M\u57fa\u7840\u64cd\u4f5c"},"content":{"rendered":"\n<p><div class=\"has-toc have-toc\"><\/div><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u8bbe\u7f6e\u9891\u7387<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>SetSysClock(CLK_SOURCE_PLL_60MHz);\n\/\/ CLK_SOURCE_PLL_80MHz\n\/\/ CLK_SOURCE_PLL_60MHz\n\/\/ CLK_SOURCE_PLL_48MHz\n\/\/ CLK_SOURCE_PLL_40MHz\n\/\/ CLK_SOURCE_PLL_36_9MHz\n\/\/ CLK_SOURCE_PLL_32MHz\n\/\/ CLK_SOURCE_PLL_30MHz\n\/\/ CLK_SOURCE_PLL_24MHz\n\/\/ CLK_SOURCE_PLL_20MHz\n\/\/ CLK_SOURCE_PLL_15MHz<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">GPIO\u64cd\u4f5c<\/h2>\n\n\n\n<p>\u51fd\u6570\u524d\u7684GPIOA\u8868\u793a\u64cd\u4f5cGPIOA\u7ec4\u5f15\u811a\uff0c\u51fd\u6570\u524d\u7684GPIOB\u8868\u793a\u64cd\u4f5cGPIOB\u7ec4\u5f15\u811a\u3002<\/p>\n\n\n\n<p>\u521d\u59cb\u5316\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeOut_PP_5mA);\/\/\u521d\u59cb\u5316A8\u5f15\u811a\n\nGPIO_ModeIN_Floating, \/\/\u6d6e\u7a7a\u8f93\u5165\nGPIO_ModeIN_PU,       \/\/\u4e0a\u62c9\u8f93\u5165                                           \u3001\nGPIO_ModeIN_PD,       \/\/\u4e0b\u62c9\u8f93\u5165\nGPIO_ModeOut_PP_5mA,  \/\/\u63a8\u633d\u8f93\u51fa\u6700\u59275mA\nGPIO_ModeOut_PP_20mA, \/\/\u63a8\u633d\u8f93\u51fa\u6700\u592720mA\n\nGPIOA_ResetBits(GPIO_Pin_8);  \/\/\u62c9\u9ad8\u5f15\u811a\nGPIOA_SetBits(GPIO_Pin_8);  \/\/\u62c9\u4f4e\u5f15\u811a\nGPIOA_InverseBits(GPIO_Pin_8);  \/\/\u7ffb\u8f6c\u5f15\u811a\nGPIOA_ReadPortPin(GPIO_Pin_4);  \/\/\u8bfb\u53d6\u5f15\u811a\u8f93\u5165<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e32\u53e3\u64cd\u4f5c<\/h2>\n\n\n\n<p>\u4e32\u53e3\u521d\u59cb\u5316<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/* \u914d\u7f6e\u4e32\u53e31\uff1a\u5148\u914d\u7f6eIO\u53e3\u6a21\u5f0f\uff0c\u518d\u914d\u7f6e\u4e32\u53e3 *\/\n    GPIOA_SetBits(GPIO_Pin_9);\n    GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);      \/\/ RXD-\u914d\u7f6e\u4e0a\u62c9\u8f93\u5165\n    GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA); \/\/ TXD-\u914d\u7f6e\u63a8\u633d\u8f93\u51fa\uff0c\u6ce8\u610f\u5148\u8ba9IO\u53e3\u8f93\u51fa\u9ad8\u7535\u5e73\n    UART1_DefInit();<\/code><\/pre>\n\n\n\n<p>\u4e32\u53e3\u64cd\u4f5c\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>uint8_t TxBuff&#91;] = \"This is a tx exam\\r\\n\";\nUART1_SendString(TxBuff, sizeof(TxBuff));  \/\/\u4e32\u53e3\u53d1\u9001\n\n\/\/\u67e5\u8be2\u65b9\u5f0f\u83b7\u53d6\u4e32\u53e3\nwhile(1)\n{\n    len = UART1_RecvString(RxBuff);\n    if(len)\n    {\n            \/\/ \u5904\u7406\n    }\n}\n\n\/\/\u4e2d\u65ad\u65b9\u5f0f\u83b7\u53d6\n\u4e3b\u51fd\u6570\uff1a\nUART1_ByteTrigCfg(UART_7BYTE_TRIG);\ntrigB = 7;\nUART1_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT);\nPFIC_EnableIRQ(UART1_IRQn);\n\n\n\/*********************************************************************\n * @fn      UART1_IRQHandler\n *\n * @brief   UART1\u4e2d\u65ad\u51fd\u6570\n *\n * @return  none\n *\/\n__INTERRUPT\n__HIGH_CODE\nvoid UART1_IRQHandler(void)\n{\n    volatile uint8_t i;\n\n    switch(UART1_GetITFlag())\n    {\n        case UART_II_LINE_STAT: \/\/ \u7ebf\u8def\u72b6\u6001\u9519\u8bef\n        {\n            UART1_GetLinSTA();\n            break;\n        }\n\n        case UART_II_RECV_RDY: \/\/ \u6570\u636e\u8fbe\u5230\u8bbe\u7f6e\u89e6\u53d1\u70b9\n            for(i = 0; i != trigB; i++)\n            {\n                RxBuff&#91;i] = UART1_RecvByte();\n                UART1_SendByte(RxBuff&#91;i]);\n            }\n            break;\n\n        case UART_II_RECV_TOUT: \/\/ \u63a5\u6536\u8d85\u65f6\uff0c\u6682\u65f6\u4e00\u5e27\u6570\u636e\u63a5\u6536\u5b8c\u6210\n            i = UART1_RecvString(RxBuff);\n            UART1_SendString(RxBuff, i);   \/\/ \u5904\u7406\u6570\u636e\n            break;\n\n        case UART_II_THR_EMPTY: \/\/ \u53d1\u9001\u7f13\u5b58\u533a\u7a7a\uff0c\u53ef\u7ee7\u7eed\u53d1\u9001\n            break;\n\n        case UART_II_MODEM_CHG: \/\/ \u53ea\u652f\u6301\u4e32\u53e30\n            break;\n\n        default:\n            break;\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">ADC<\/h2>\n\n\n\n<p>\u5185\u90e8\u6e29\u5ea6\u4f20\u611f\u5668\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ADC_InterTSSampInit(); \/\/ \u521d\u59cb\u5316ADC\u5185\u90e8\u6e29\u5ea6\u4f20\u611f\u5668\u91c7\u6837\nwhile(1)\n{\n    uint16_t adcNum = ADC_ExcutSingleConver();  \/\/ \u6267\u884c\u4e00\u6b21ADC\u8f6c\u6362\u5e76\u83b7\u53d6\u7ed3\u679c\n    PRINT(\"%d \\n\", adc_to_temperature_celsius(adcNum));  \/\/ \u5c06ADC\u91c7\u6837\u503c\u8f6c\u6362\u4e3a\u6444\u6c0f\u6e29\u5ea6\u5e76\u6253\u5370\n    mDelaymS(500);\n}<\/code><\/pre>\n\n\n\n<p>\u5355\u901a\u9053\u91c7\u6837\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    GPIOA_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_Floating);  \/\/ \u914d\u7f6ePA4\u4e3a\u6d6e\u7a7a\u8f93\u5165\uff0c\u7528\u4e8eADC\u5355\u901a\u9053\u91c7\u6837\n    ADC_ExtSingleChSampInit(SampleFreq_3_2, ADC_PGA_0);  \/\/ \u521d\u59cb\u5316ADC\u5355\u7aef\u901a\u9053\u91c7\u6837\uff0c\u91c7\u6837\u9891\u7387\u4e3a3.2MHz\uff0cPGA\u589e\u76ca\u4e3a0\n\n    RoughCalib_Value = ADC_DataCalib_Rough(); \/\/ \u7528\u4e8e\u8ba1\u7b97ADC\u5185\u90e8\u504f\u5dee\uff0c\u8bb0\u5f55\u5230\u5168\u5c40\u53d8\u91cf RoughCalib_Value\u4e2d\n    PRINT(\"\u5185\u90e8\u504f\u5dee\u503c =%d \\n\", RoughCalib_Value);\n\n    ADC_ChannelCfg(0);  \/\/ \u914d\u7f6eADC\u901a\u90530\u8fdb\u884c\u91c7\u6837\n\n    while (1)\n    {\n        uint16_t adcNum = ADC_ExcutSingleConver() + RoughCalib_Value; \/\/ \u6267\u884c\u4e00\u6b21ADC\u8f6c\u6362\u5e76\u83b7\u53d6\u7ed3\u679c\uff0c\u6dfb\u52a0\u7c97\u8c03\u504f\u5dee\u503c\n        PRINT(\"%d \\n\", adcNum); \/\/ \u6ce8\u610f\uff1a\u7531\u4e8eADC\u5185\u90e8\u504f\u5dee\u7684\u5b58\u5728\uff0c\u5f53\u91c7\u6837\u7535\u538b\u5728\u6240\u9009\u589e\u76ca\u8303\u56f4\u6781\u9650\u9644\u8fd1\u7684\u65f6\u5019\uff0c\u53ef\u80fd\u4f1a\u51fa\u73b0\u6570\u636e\u6ea2\u51fa\u7684\u73b0\u8c61\n        mDelaymS(500);\n    }<\/code><\/pre>\n\n\n\n<p>DMA\u5355\u901a\u9053\u91c7\u6837\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/* DMA\u5355\u901a\u9053\u91c7\u6837\uff1a\u9009\u62e9adc\u901a\u90530\u505a\u91c7\u6837\uff0c\u5bf9\u5e94 PA4\u5f15\u811a *\/\nuint16_t adcBuff&#91;40];  \/\/ \u7528\u4e8e\u5b58\u50a8DMA\u91c7\u6837\u6570\u636e\nvolatile uint8_t DMA_end = 0;  \/\/ DMA\u91c7\u6837\u7ed3\u675f\u6807\u5fd7\n\nGPIOA_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_Floating);  \/\/ \u914d\u7f6ePA4\u4e3a\u6d6e\u7a7a\u8f93\u5165\uff0c\u7528\u4e8eADC\u5355\u901a\u9053\u91c7\u6837\nADC_ExtSingleChSampInit(SampleFreq_3_2, ADC_PGA_0);  \/\/ \u521d\u59cb\u5316ADC\u5355\u7aef\u901a\u9053\u91c7\u6837\uff0c\u91c7\u6837\u9891\u7387\u4e3a3.2MHz\uff0cPGA\u589e\u76ca\u4e3a0\nADC_ChannelCfg(0);  \/\/ \u914d\u7f6eADC\u901a\u90530\u8fdb\u884c\u91c7\u6837\nADC_AutoConverCycle(192); \/\/ \u91c7\u6837\u5468\u671f\u4e3a (256-192)*16\u4e2a\u7cfb\u7edf\u65f6\u949f\nADC_DMACfg(ENABLE, (uint16_t)(uint32_t)&amp;adcBuff&#91;0], (uint16_t)(uint32_t)&amp;adcBuff&#91;40], ADC_Mode_Single);  \/\/ \u914d\u7f6eDMA\u91c7\u6837\uff0c\u4f7f\u7528\u5355\u901a\u9053\u6a21\u5f0f\uff0c\u6570\u636e\u5b58\u50a8\u5728adcBuff\u6570\u7ec4\u4e2d\nPFIC_EnableIRQ(ADC_IRQn);  \/\/ \u4f7f\u80fdADC\u4e2d\u65ad\nADC_StartDMA();  \/\/ \u542f\u52a8DMA\u91c7\u6837\nwhile(!DMA_end);  \/\/ \u7b49\u5f85DMA\u91c7\u6837\u5b8c\u6210\nDMA_end = 0;  \/\/ \u91cd\u7f6eDMA\u7ed3\u675f\u6807\u5fd7\nADC_DMACfg(DISABLE, 0, 0, 0);  \/\/ \u7981\u7528DMA\u91c7\u6837\n\nfor(i = 0; i &lt; 40; i++)\n{\n    PRINT(\"%d \\n\", adcBuff&#91;i]);\n}<\/code><\/pre>\n\n\n\n<p>\u5dee\u5206\u901a\u9053\u91c7\u6837\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/* \u5dee\u5206\u901a\u9053\u91c7\u6837\uff1a\u9009\u62e9adc\u901a\u90530\u505a\u91c7\u6837\uff0c\u5bf9\u5e94 PA4(AIN0)\u3001PA12(AIN2) *\/\nGPIOA_ModeCfg(GPIO_Pin_4 | GPIO_Pin_12, GPIO_ModeIN_Floating);  \/\/ \u914d\u7f6ePA4\u548cPA12\u4e3a\u6d6e\u7a7a\u8f93\u5165\uff0c\u7528\u4e8eADC\u5dee\u5206\u901a\u9053\u91c7\u6837\nADC_ExtDiffChSampInit(SampleFreq_3_2, ADC_PGA_0);  \/\/ \u521d\u59cb\u5316ADC\u5dee\u5206\u901a\u9053\u91c7\u6837\uff0c\u91c7\u6837\u9891\u7387\u4e3a3.2MHz\uff0cPGA\u589e\u76ca\u4e3a0\nADC_ChannelCfg(0);  \/\/ \u914d\u7f6eADC\u901a\u90530\u8fdb\u884c\u91c7\u6837\nwhile (1)\n{\n    uint16_t adcNum = ADC_ExcutSingleConver();   \/\/ \u6267\u884c\u4e00\u6b21ADC\u8f6c\u6362\u5e76\u83b7\u53d6\u7ed3\u679c\n    PRINT(\"%d \\n\", adcNum);\n}<\/code><\/pre>\n\n\n\n<p>TouchKey\u91c7\u6837\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GPIOA_ModeCfg(GPIO_Pin_12, GPIO_ModeIN_Floating);  \/\/ \u914d\u7f6ePA12\u4e3a\u6d6e\u7a7a\u8f93\u5165\uff0c\u7528\u4e8eTouchKey\u91c7\u6837\nTouchKey_ChSampInit();  \/\/ \u521d\u59cb\u5316TouchKey\u91c7\u6837\nADC_ChannelCfg(2);  \/\/ \u914d\u7f6eADC\u901a\u90532\u8fdb\u884c\u91c7\u6837\n\nwhile (1)\n{\n    uint16_t adcNum = TouchKey_ExcutSingleConver(0x10, 0); \/\/ \u6267\u884c\u4e00\u6b21TouchKey\u8f6c\u6362\u5e76\u83b7\u53d6\u7ed3\u679c\uff0c0x10\u4e3a\u91c7\u6837\u6b21\u6570\uff0c0\u4e3a\u6821\u51c6\u503c\n    PRINT(\"%d \\n\", adcNum);\n    mDelaymS(500);\n}\n<\/code><\/pre>\n\n\n\n<p>\u5355\u901a\u9053\u91c7\u6837\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>volatile uint8_t adclen;  \/\/ \u91c7\u6837\u957f\u5ea6\u8ba1\u6570\u5668\uff0c\u5168\u5c40\u53d8\u91cf\n\n\/* \u5355\u901a\u9053\u91c7\u6837\uff1a\u4e2d\u65ad\u65b9\u5f0f,\u9009\u62e9adc\u901a\u90531\u505a\u91c7\u6837\uff0c\u5bf9\u5e94 PA5\u5f15\u811a\uff0c \u4e0d\u5e26\u6570\u636e\u6821\u51c6\u529f\u80fd *\/\nGPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_Floating);  \/\/ \u914d\u7f6ePA5\u4e3a\u6d6e\u7a7a\u8f93\u5165\uff0c\u7528\u4e8eADC\u5355\u901a\u9053\u91c7\u6837\uff08\u4e2d\u65ad\u65b9\u5f0f\uff09\nADC_ExtSingleChSampInit(SampleFreq_3_2, ADC_PGA_0);  \/\/ \u521d\u59cb\u5316ADC\u5355\u7aef\u901a\u9053\u91c7\u6837\uff0c\u91c7\u6837\u9891\u7387\u4e3a3.2MHz\uff0cPGA\u589e\u76ca\u4e3a0\nADC_ChannelCfg(1);  \/\/ \u914d\u7f6eADC\u901a\u90531\u8fdb\u884c\u91c7\u6837\nadclen = 0;  \/\/ \u521d\u59cb\u5316\u91c7\u6837\u957f\u5ea6\u8ba1\u6570\u5668\nADC_ClearITFlag();  \/\/ \u6e05\u9664ADC\u4e2d\u65ad\u6807\u5fd7\nPFIC_EnableIRQ(ADC_IRQn);  \/\/ \u4f7f\u80fdADC\u4e2d\u65ad\n\nADC_StartUp();  \/\/ \u542f\u52a8ADC\u91c7\u6837\uff0c\u5f00\u59cb\u4e2d\u65ad\u91c7\u6837\nwhile(adclen &lt; 20);  \/\/ \u7b49\u5f85\u91c7\u6837\u5b8c\u6210\uff0c\u76f4\u5230\u91c7\u6837\u957f\u5ea6\u8fbe\u523020\nPFIC_DisableIRQ(ADC_IRQn);  \/\/ \u7981\u7528ADC\u4e2d\u65ad\nfor(i = 0; i &lt; 20; i++)  \n{\n    PRINT(\"%d \\n\", adcBuff&#91;i]);\n}\n\n\/*********************************************************************\n * @fn      ADC_IRQHandler\n *\n * @brief   ADC\u4e2d\u65ad\u51fd\u6570\n *\n * @return  none\n *\/\n__INTERRUPT\n__HIGH_CODE\nvoid ADC_IRQHandler(void) \/\/adc\u4e2d\u65ad\u670d\u52a1\u7a0b\u5e8f\n{\n    if(ADC_GetDMAStatus())\n    {\n        ADC_StopDMA();\n        R16_ADC_DMA_BEG = ((uint32_t)adcBuff) &amp; 0xffff;\n        ADC_ClearDMAFlag();\n        DMA_end = 1;\n    }\n    if(ADC_GetITStatus())\n    {\n        ADC_ClearITFlag();\n        if(adclen &lt; 20)\n        {\n            adcBuff&#91;adclen] = ADC_ReadConverValue();\n            ADC_StartUp(); \/\/ \u4f5c\u7528\u6e05\u9664\u4e2d\u65ad\u6807\u5fd7\u5e76\u5f00\u542f\u65b0\u4e00\u8f6e\u91c7\u6837\n        }\n        adclen++;\n    }\n}\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u8bbe\u7f6e\u9891\u7387 GPIO\u64cd\u4f5c \u51fd\u6570\u524d\u7684GPIOA\u8868\u793a\u64cd\u4f5cGPIOA\u7ec4\u5f15\u811a\uff0c\u51fd\u6570\u524d\u7684GPIOB\u8868\u793a\u64cd\u4f5cGPIOB\u7ec4\u5f15\u811a\u3002 \u521d\u59cb\u5316\uff1a \u4e32\u53e3\u64cd &#8230;<\/p>","protected":false},"author":1,"featured_media":1935,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[48,3],"tags":[49,12],"class_list":["post-1931","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-48","category-3","tag-49","tag-12"],"_links":{"self":[{"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/posts\/1931","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/comments?post=1931"}],"version-history":[{"count":4,"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/posts\/1931\/revisions"}],"predecessor-version":[{"id":1940,"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/posts\/1931\/revisions\/1940"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/media\/1935"}],"wp:attachment":[{"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/media?parent=1931"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/categories?post=1931"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/tags?post=1931"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}