全國服務熱線

18219276011

2850818308

您當前位置:首頁>>升威資訊
升威資訊
公司新聞
企業視頻
行業資訊
技術支持
廣東升威電子制品有限公司
地址:東莞市塘廈鎮鳳凰崗鳳清路39號升威工業園
電話:0769-38833333-881
銷售電話:18219276011
傳真:0769-87930111
E-mail:sw@soundwell-cn.com
編碼開關應用在STM32單片機
發布時間:2019-03-08
發布者:
瀏覽次數:206次

小編在網上找到了一個編碼開關的程序,原創作者 巨大八爪魚,分享給大家,有需要的朋友們可以看一下.


/* 本程序測試時使用的是銳志電子六合一擴展板上的數字旋轉編碼開關 */
#include <stm32f10x.h>
 
int main(void)
{
    /* 打開外設時鐘 */
    RCC->APB1ENR = RCC_APB1ENR_TIM2EN | RCC_APB1ENR_TIM3EN;
    RCC->APB2ENR = RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN;
    
    /* I/O端口配置 */
    GPIOA->CRL = 0x88000000; // PA6為通道1, PA7為通道2, 設為帶電阻輸入
    GPIOA->BSRR = GPIO_BSRR_BS6 | GPIO_BSRR_BS7; // PA6~7帶上拉電阻輸入
    GPIOA->CRH = 0x00080000; // PA12設為帶電阻輸入
    GPIOA->BSRR = GPIO_BSRR_BS12;
    GPIOB->CRH = 0x33333333; // 數碼管段選
    GPIOC->ODR = 0x3000; // 熄滅數碼管
    GPIOC->CRH = 0x00333333; // 數碼管位選
    
    /* 數碼管掃描中斷配置 */
    // 每隔一定時間點亮一個數碼管
    // 從低位向高位掃描
    TIM2->ARR = 29; // 0~29有30個數字, 定時時間30*0.1ms=3ms, 向上計數, 每當TIM2->CNT跳變到0時觸發一次中斷
    TIM2->PSC = 7199; // 對72MHz進行7200分頻, 得到的頻率是10kHz, 也就是0.1ms
    TIM2->EGR = TIM_EGR_UG; // 立即觸發TIM2中斷, 點亮數碼管, 同時刷新寄存器
    TIM2->DIER = TIM_DIER_UIE; // 允許觸發定時器溢出中斷
    NVIC_EnableIRQ(TIM2_IRQn); // 允許執行中斷服務函數, 該函數位于core_cm3.h, 是MDK自帶的函數, 不是庫函數
    TIM2->CR1 = TIM_CR1_CEN; // 開定時器
    
    /* 數字編碼開關計數器配置 */
    // 將數字編碼開關的1、3腳分別接到TIM3定時器的通道1~2輸入端口PA6~7上
    TIM3->ARR = TIM_ARR_ARR; // 計數的最大值為65535
    TIM3->CCMR1 = TIM_CCMR1_CC1S_0; // CC1S=01(IC1映射到TI1)
    TIM3->CCMR1 |= TIM_CCMR1_CC2S_0; // CC2S=01(IC2映射到TI2)
    
    // 以下三種模式任選一種即可
    TIM3->SMCR = TIM_SMCR_SMS_0; // SMS=001, 對通道1計數
    //TIM3->SMCR = TIM_SMCR_SMS_1; // SMS=010, 對通道2計數
    //TIM3->SMCR = TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0; // SMS=011, 同時對通道1,2計數(計數速度更快)
    
    TIM3->CCER = TIM_CCER_CC1P; // 反轉TI1的電平, 順時針旋轉時使計數值增加而不是減少(默認是減少)
    // 也可以改為反轉TI2的電平, 這個和上面SMS的選擇無關
    
    TIM3->EGR = TIM_EGR_UG; // 刷新寄存器
    TIM3->CR1 = TIM_CR1_CEN; // 開始計數
    
    /* 開PA12外中斷 */
    EXTI->IMR = EXTI_IMR_MR12;
    EXTI->FTSR = EXTI_FTSR_TR12; // 下降沿觸發
    NVIC_EnableIRQ(EXTI15_10_IRQn);
    NVIC_SetPriority(EXTI15_10_IRQn, 1); // 該中斷優先級比數碼管掃描中斷的優先級低, 不會影響數碼管掃描
    
    while (1);
}
 
// 數碼管動態掃描
void TIM2_IRQHandler(void)
{
    static uint8_t pos = 5;
    static uint32_t numbuf;
    const uint8_t seg8[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
    if (TIM2->SR & TIM_SR_UIF) // 定時器2溢出中斷
    {
        TIM2->SR &= ~TIM_SR_UIF; // 清中斷標志
        if (pos == 5)
            numbuf = TIM3->CNT; // 取定時器3的計數值
        else
            numbuf /= 10;
        
        GPIOC->ODR = (GPIOC->ODR & 0xf0ff) | 0x3000; // 關閉位選
        GPIOB->ODR = (GPIOB->ODR & 0xff) | (seg8[numbuf % 10] << 8); // 設置顯示字符
        if (pos <= 3)
            GPIOC->ODR |= 1 << (pos + 8); // 數碼管1~4的位選直連I/O端
        else
            GPIOC->ODR &= ~(1 << (pos + 8)); // 數碼管5~6的位選是由PNP三極管驅動
        if (pos == 0)
            pos = 5;
        else
            pos--;
    }
}
 
// 編碼開關按鍵按下中斷
void EXTI15_10_IRQHandler(void)
{
    EXTI->PR |= EXTI_PR_PR12; // 清中斷標志
    TIM3->EGR = TIM_EGR_UG; // 重置定時器3, 使計數值歸0
}


廣東升威電子專業生產旋轉編碼開關28年,編碼開關型號齊全多選,質量安全可靠,找編碼開關廠家首選老牌編碼器廠家升威電子.




編碼開關廠家


最新案例
蚂蚁彩票|官网登录 聚星彩票|手机app下载 众彩彩票|官网登录 大兴彩票|官网登录 桔子彩票|手机app下载 众彩彩票|手机app下载 66彩票|官网登录 头头彩票|官网登录 盈发彩票|官网登录 聚彩彩票|手机app下载 248彩票|手机app下载 8828彩票|官网登录 天福彩票|官网登录