- /*******************************************************************************
- * [url=home.php?mod=space&uid=247401]@brief[/url]
- * @param
- * @retval
- * [url=home.php?mod=space&uid=93590]@Attention[/url]
- *******************************************************************************/
- void USART1_Init(void)
- {
- CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
- USART_InitTypeDef USART_InitStructure;
- USART_InitStructure.USART_BaudRate = 115200;
- USART_InitStructure.USART_WordLength = USART_WORDLENGTH_8B;
- USART_InitStructure.USART_StopBits = USART_STOPBITS_1;
- USART_InitStructure.USART_Parity = USART_PARITY_NO;
- USART_InitStructure.USART_Mode = USART_MODE_NORMAL;
- CKCUClock.Bit.USART1 = 1;
- CKCUClock.Bit.AFIO = 1;
- CKCU_PeripClockConfig(CKCUClock, ENABLE);
- AFIO_GPxConfig(GPIO_PA, AFIO_PIN_4, AFIO_FUN_USART_UART);
- AFIO_GPxConfig(GPIO_PA, AFIO_PIN_5, AFIO_FUN_USART_UART);
- USART_Init(HT_USART1, &USART_InitStructure);
- USART_TxCmd(HT_USART1, ENABLE);
- USART_RxCmd(HT_USART1, ENABLE);
- NVIC_EnableIRQ(USART1_IRQn);
- }
- /*******************************************************************************
- * @brief
- * @param
- * @retval
- * @attention
- *******************************************************************************/
- void USART1_IRQHandler(void)
- {
- }
- /*******************************************************************************
- * @brief
- * @param
- * @retval
- * @attention
- *******************************************************************************/
- int fputc(int ch, FILE *f)
- {
- HT_USART1->DR = (uint8_t)ch;
- while((HT_USART1->SR & USART_FLAG_TXC) == RESET);
- return ch;
- }
- /* Private typedef -----------------------------------------------------------*/
- typedef struct
- {
- HT_GPIO_TypeDef* HT_GPIOx;
- uint8_t Index;
- uint16_t GPIO_PIN_n;
- FlagStatus ActiveLevel;
- } KEY_TypeDef;
- /* Private define ------------------------------------------------------------*/
- /* Private macro -------------------------------------------------------------*/
- /* Private variables ---------------------------------------------------------*/
- KEY_TypeDef KEY_TAB[3] =
- {
- {HT_GPIOB, GPIO_PB, GPIO_PIN_12, SET},
- {HT_GPIOB, GPIO_PB, GPIO_PIN_2, RESET},
- {HT_GPIOD, GPIO_PD, GPIO_PIN_3, RESET},
- };
- /* Private variables ---------------------------------------------------------*/
- struct Button btnKn[3];
- /* Private variables ---------------------------------------------------------*/
- MultiTimer KEY_MultiTimer;
- /* Private function prototypes -----------------------------------------------*/
- /* Private functions ---------------------------------------------------------*/
- /* Exported variables --------------------------------------------------------*/
- /* Exported function prototypes ----------------------------------------------*/
- /*******************************************************************************
- * @brief
- * @param
- * @retval
- * @attention
- *******************************************************************************/
- uint8_t read_pin_level(uint8_t pin_id)
- {
- return GPIO_ReadInBit(KEY_TAB[pin_id].HT_GPIOx, KEY_TAB[pin_id].GPIO_PIN_n);
- }
- /*******************************************************************************
- * @brief
- * @param
- * @retval
- * @attention
- *******************************************************************************/
- void KEY_Handler(void *btn)
- {
- Button *key = btn;
- char *KEY_NAME[3] = {"Wakeup", "Key1", "Key2"};
- switch(key->event)
- {
- case PRESS_DOWN:
- printf("\r\n%s : PRESS_DOWN", KEY_NAME[key->button_id]);
- break;
- case PRESS_UP:
- printf("\r\n%s : PRESS_UP", KEY_NAME[key->button_id]);
- break;
- case SINGLE_CLICK:
- printf("\r\n%s : SINGLE_CLICK", KEY_NAME[key->button_id]);
- break;
- case DOUBLE_CLICK:
- printf("\r\n%s : DOUBLE_CLICK", KEY_NAME[key->button_id]);
- break;
- case LONG_PRESS_START:
- printf("\r\n%s : LONG_PRESS_START", KEY_NAME[key->button_id]);
- break;
- case LONG_PRESS_HOLD:
- printf("\r\n%s : LONG_PRESS_HOLD", KEY_NAME[key->button_id]);
- break;
- default:
- break;
- }
- }
- /*******************************************************************************
- * @brief
- * @param
- * @retval
- * @attention
- *******************************************************************************/
- void KEY_RepeatHandler(void *btn)
- {
- Button *key = btn;
- switch(key->button_id)
- {
- case 0 : printf("\r\nK1 : PRESS_REPEAT"); break;
- case 1 : printf("\r\nK2 : PRESS_REPEAT"); break;
- case 2 : printf("\r\nK3 : PRESS_REPEAT"); break;
- case 3 : printf("\r\nK4 : PRESS_REPEAT"); break;
- default: break;
- }
- }
- /*******************************************************************************
- * @brief
- * @param
- * @retval
- * @attention
- *******************************************************************************/
- void KEY_MultiTimerCallback(MultiTimer *timer, void *userData)
- {
- button_ticks();
- MultiTimerStart(&KEY_MultiTimer, 5, KEY_MultiTimerCallback, "KEY");
- }
- /*******************************************************************************
- * @brief
- * @param
- * @retval
- * @attention
- *******************************************************************************/
- void KEY_Init(void)
- {
- CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
- CKCUClock.Bit.PB = 1;
- CKCUClock.Bit.PD = 1;
- CKCUClock.Bit.AFIO = 1;
- CKCU_PeripClockConfig(CKCUClock, ENABLE);
- for(uint8_t i = 0; i < 3; i++)
- {
- AFIO_GPxConfig(KEY_TAB[i].Index, KEY_TAB[i].GPIO_PIN_n, AFIO_FUN_GPIO);
- GPIO_PullResistorConfig(KEY_TAB[i].HT_GPIOx, KEY_TAB[i].GPIO_PIN_n, GPIO_PR_DISABLE);
- GPIO_DirectionConfig( KEY_TAB[i].HT_GPIOx, KEY_TAB[i].GPIO_PIN_n, GPIO_DIR_IN);
- GPIO_InputConfig( KEY_TAB[i].HT_GPIOx, KEY_TAB[i].GPIO_PIN_n, ENABLE);
- button_init( &btnKn[i], read_pin_level, KEY_TAB[i].ActiveLevel, i);
- button_attach(&btnKn[i], SINGLE_CLICK, KEY_Handler);
- button_start( &btnKn[i]);
- }
- MultiTimerStart(&KEY_MultiTimer, 250, KEY_MultiTimerCallback, "KEY");
- }
- /* Private variables ---------------------------------------------------------*/
- MultiTimer LED_MultiTimer;
- /* Private function prototypes -----------------------------------------------*/
- /* Private functions ---------------------------------------------------------*/
- /* Exported variables --------------------------------------------------------*/
- /* Exported function prototypes ----------------------------------------------*/
- /*******************************************************************************
- * @brief
- * @param
- * @retval
- * @attention
- *******************************************************************************/
- void LED_MultiTimerCallback(MultiTimer *timer, void *userData)
- {
- HT_GPIOD->DOUTR ^= GPIO_PIN_1;
- HT_GPIOC->DOUTR ^= GPIO_PIN_14;
- HT_GPIOC->DOUTR ^= GPIO_PIN_15;
- MultiTimerStart(&LED_MultiTimer, 250, LED_MultiTimerCallback, "LED");
- }
- /*******************************************************************************
- * @brief
- * @param
- * @retval
- * @attention
- *******************************************************************************/
- void LED_Init(void)
- {
- CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
- CKCUClock.Bit.PC = 1;
- CKCUClock.Bit.PD = 1;
- CKCUClock.Bit.AFIO = 1;
- CKCU_PeripClockConfig(CKCUClock, ENABLE);
- AFIO_GPxConfig(GPIO_PD, GPIO_PIN_1, AFIO_FUN_GPIO);
- AFIO_GPxConfig(GPIO_PC, GPIO_PIN_14, AFIO_FUN_GPIO);
- AFIO_GPxConfig(GPIO_PC, GPIO_PIN_15, AFIO_FUN_GPIO);
- HT_GPIOD->SRR = GPIO_PIN_1;
- HT_GPIOC->SRR = GPIO_PIN_14;
- HT_GPIOC->SRR = GPIO_PIN_15;
- GPIO_PullResistorConfig(HT_GPIOD, GPIO_PIN_1, GPIO_PR_DISABLE);
- GPIO_DriveConfig( HT_GPIOD, GPIO_PIN_1, GPIO_DV_8MA);
- GPIO_DirectionConfig( HT_GPIOD, GPIO_PIN_1, GPIO_DIR_OUT);
- GPIO_PullResistorConfig(HT_GPIOC, GPIO_PIN_14, GPIO_PR_DISABLE);
- GPIO_DriveConfig( HT_GPIOC, GPIO_PIN_14, GPIO_DV_8MA);
- GPIO_DirectionConfig( HT_GPIOC, GPIO_PIN_14, GPIO_DIR_OUT);
- GPIO_PullResistorConfig(HT_GPIOC, GPIO_PIN_15, GPIO_PR_DISABLE);
- GPIO_DriveConfig( HT_GPIOC, GPIO_PIN_15, GPIO_DV_8MA);
- GPIO_DirectionConfig( HT_GPIOC, GPIO_PIN_15, GPIO_DIR_OUT);
- MultiTimerStart(&LED_MultiTimer, 250, LED_MultiTimerCallback, "LED");
- }
运行结果
LED灯间隔250ms切换一次显示状态,当用户按下按键并抬起后,能够正确识别到对应的按键,并通过RS-232打印输出提示信息:
软件工程源代码
Project.zip
(842.44 KB, 下载次数: 7)
后续
第一次使用合泰的MCU/开发板,在参考示例工程报建新的工程时,需要注意在进行工程配置时,C/C++选项表和ASM选项表中预定义宏的配置,如果配置不正确会有相应的编译错误提示;另外就是startup和system文件后面是以数字序号的形式体现的,需要参考示例工程才知道添加哪一个,不是很习惯;在程序中对于外设时钟的初始化也是习惯的一个过程,与ST或者是国内其它MCU厂家的编程风格还是有些区别的,需要好好熟悉和适应一下,但整体第一次尝试,感觉还是挺好的,没有遇到卡壳的问题。