CCITT标准的CRC16计算

#define POLY        0x1021  
/**
*CITT标准的CRC16计算
*addr:待计算数据的起始地址
*num:待计算数据长度(字节数)
*返回值:16位校验值
**/
uint16_t crc16(uint8_t *addr, uint32_t num)  
{  
    int i;  
    uint16_t crc = 0xFFFF;
    for (; num > 0; num--)
    {  
        crc = crc ^ (*addr++ << 8);
        for (i = 0; i < 8; i++) 
        {  
            if (crc & 0x8000)
                crc = (crc << 1) ^ POLY; 
            else                        
                crc <<= 1;
        }                 
        crc &= 0xFFFF; 
    } 
    return(crc);
}  

MODBUS RTU通信的 CRC16计算

#define POLY   0xa001;

/**
*根据ModBus规则计算CRC16
*addr:待计算数据的起始地址
*num:待计算数据长度(字节数)
*返回值:16位校验值
**/
uint16_t crc16(uint8_t *addr, uint32_t num)
{
    uint16_t crc = 0xFFFF
    for(;num > 0;num--)
    {
        crc = crc^(*addr++);
        for(int i = 0;i<8;i++)
        {
            if(crc & 0x0001)
                crc = (crc>>1)^POLY;
            else
                crc >>= 1;
        }
    }
    return(crc);
}

C语言开根号

这里实现的是32位无符号整数开方得到16位无符号整数的C语言代码

/**************************************** 
*
* Function: 开根号处理
* 入口参数:被开方数,长整型 
* 出口参数:开方结果,整型 
*
*****************************************/ 

unsigned int sqrt_16(unsigned long M)
{
	unsigned int N, i;
	unsigned long tmp, ttp; // 结果、循环计数

	if (M == 0) // 被开方数,开方结果也为0
		return 0;
	N = 0;
	tmp = (M >> 30); // 获取最高位:B[m-1]
	M <<= 2;
	if (tmp > 1) // 最高位为1
	{
		N ++;
		tmp -= N;
	}
	for (i=15; i>0; i--) // 求剩余的15位
	{
		N <<= 1;
		tmp <<= 2;
		tmp += (M >> 30); 
		ttp = N;
		ttp = (ttp<<1)+1;
		M <<= 2;
		if (tmp >= ttp)
		{
			tmp -= ttp;
			N ++;
		}
	}
	return N;
}

Navicat连接SQL时出现1045错误的解决方法

最近趁优惠活动,入手了一台轻量应用服务器玩玩。

安装了Wordpress博客系统,然后想用Navicat连接数据库来看看相关数据,结果提示1045错误,不让连接!咋是电子行业的程序猿,在WEB方面是半调子水平,凭自己的水平肯定是搞不定,只能是万能的百度来解决!

网上闲逛一圈,主要有下面两方面问题:

1、输错了登陆的用户名或密码

2、需要登陆的用户没有权限,默认数据库创建的账号权限仅限于localhost

我确信登陆的用户名和密码正确,那唯一的问题就是登陆用户没有远程登陆的权限!

问题找到就好办,直接登陆服务器,给用户设定远程登陆的权限就OK了。

主要的操作命令有现在几条:

1、登陆mysq数据库:mysql -u root -p

2、选择你要操作的数据表:use XXXX

3、授权用户在任意IP都可以登陆:grant all privileges on . to username@’%’ with grant option;

4、刷新权限:flush privileges;

我的操作截图如下:

STM32103 PWM+DMA驱动WS2812B 寄存器版

最近项目上用到WS2812B的LED光源,主控芯片为STM32F103,经过一翻折腾,顺利点亮光源,现分享与大家,仅供参考!

程序没有用ST库,直接操作寄存器完成,如有什么问题,欢迎大家留言交流。

WS2812B的控制原理我这不多说,大家可以搜下,我们直接开始代码的实现。


程序中我们定义两个一维数组,一个是用来存放LED灯RGB的值,存放顺序如下(这个数组可以定义成二维数码)

另外一个数组用来存放前面数组转换成定时器的PWM值,DMA就是直接读取这些数据发送给定时器。其中第一和最后一个数据固定为0,意义就是为了让发送数据开始前和结束后一直是低电平,在整个程序运行过程中,我的定时器一直是在工作的,没有关闭。

PWM输出引脚我用的是定时器3的通道4(TIM3_CH4),触发的DMA的通道3

程序代码如下:

#ifndef __WS281x_H__
#define __WS281x_H__
 
#define TIMER_PERIOD    (60)  //定时器的自动重载值,控制PWM波形的周期
#define WS281x_0        (19)  //0码对应的比较值
#define WS281x_1        (38)  //1码对应的比较值
 
#define LED_NUM         (4)   //LED灯的数量
 
#define LEN_LED_BIT     (LED_NUM * 24 + 2)//加2:第一个和最后一个数据为0,使其输出为低电平
 
 
void WS281xInit(void);
void WS281xSend(void);
void SetRGBData(uint16_t NumLed,uint8_t ValG,uint8_t ValR,uint8_t ValB);
 
#endif // __WS281x_H__
阅读全文

关于Keil Unable to find ARM libraries…问题的解决方法

最近打算试试上海东软的M0芯片HR8P506,但是他们提供的Keil插件不支持Keil5的部分版本,推荐用户使用Keil4,所以我就忍痛卸载了Keil5,重新安装了Keil 4.7,但问题来了,一编译就出现问题:

Unable to fine ARM libraries.
No compatible library exists with a definition of startup sybol __main.

找了头天没找到什么原因,后来网上搜了下,才想起应该是环境变量引起的问题,因为我以前安装的时候增加过环境变量,这次安装的路径与上一次的不一样,这样就整出了这个问题,把以前设置的环境变量重新修改,然后重启下电脑,问题就解决了

如果你也出现过类似的问题,但是以前没的增加过这样的环境变量,那么你需要重新增加一个环境变量。具体操作如下
1、电脑->属性->高级->环境变量
2、新建
3、变量名设置为:ARMCC5LIB
4、设置变量值:C:\Keil\ARM\ARMCC\lib(这是我的KEIL安装的位置,请根据你自己的安装路径来设置你的变量值)

另外还有一个要注意,那就是Keil与ADS的冲突也会引起这问题,这就需要你把ADS的环境变量全部删除了,这问题也就解决了