目前共有2篇帖子。 內容轉換:不轉換▼
 
點擊 回復
221 1
【程序】STM32 CRC32校验值计算模块的使用
一派護法 十九級
1樓 發表于:2017-1-8 16:13
#include <stm32f10x.h>

#define _BV(n) (1 << (n))

uint32_t data;
uint8_t seg8[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xa7, 0xa1, 0x86, 0x8e};

void delay(void)
{
    uint32_t i;
    for (i = 0; i < 2000; i++);
}

// 74HC595驱动数码管
void SerIn(uint8_t data)
{
    uint8_t i;
    for (i = 0; i < 8; i++)
    {
        GPIOC->BRR = _BV(15); // 数据输入时钟线SHCP(=SCLK)->PC15, 上升沿有效
        if (data & 0x80)
            GPIOA->BSRR = _BV(0); // 串行数据输入DS(=DIN)->PA0
        else
            GPIOA->BRR = _BV(0);
        GPIOC->BSRR = _BV(15);
        data <<= 1; // 先高位后低位
    }
}

void ParOut(void)
{
    GPIOC->BRR = _BV(14); // 输出存储器锁存时钟线STCP(=RCLK)->PC14, 上升沿
    GPIOC->BSRR = _BV(14);
}

// 用8个数码管显示data变量的值
void seg_scan(uint8_t n)
{
    uint8_t i;
    uint32_t d = data;
    while (n--)
    {
        for (i = 0; i < 8; i++)
        {
            SerIn(seg8[d & 0x0f]);
            SerIn(_BV(i));
            ParOut();
            delay();
            d >>= 4;
        }
    }
}

int main(void)
{
    RCC->AHBENR = _BV(6); // 开启CRC时钟
    RCC->APB2ENR = _BV(2) | _BV(4); // 开启PA、PC时钟
    GPIOA->CRL = 0x00000003; // PA0设为输出
    GPIOC->CRH = 0x33300000; // PA13~15设为输出
    GPIOC->BSRR = _BV(13); // 熄灭LED指示灯
    
    CRC->DR = 0xabcdef23;
    data = CRC->DR; // 输出0x4b1abbf3
    
    //CRC->CR |= _BV(0); // 复位
    CRC->DR = 0xabcdef23;
    CRC->DR = 0x1138bb64;
    data = CRC->DR; // 输出0x6009af50
    // 若不复位, 则输出0x5b68f380
    
    while (1)
    {
        seg_scan(1);
    }
}
一派護法 十九級
2樓 發表于:2017-1-8 16:18
CRC->IDR是独立的8位数据寄存器,与CRC模块没有关系。可以当做一个普通的寄存器使用。

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:221 回複數:1
評論數: ?
作者: 巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2017-1-8 16:18
 
©2010-2024 Arslanbar Ver2.0
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。