📄 fun.c
字号:
/*
****************************************************************************
* 宁波中科集成电路设计中心 版权所有 Copyright 2005
* http:\\www.nbicc.com
*文件名: fun.c
*程序员: 夏鹏 xpsonny@nbicc.com
*主要内容:常用函数
*
*如有问题或BUG,请登录www.wsn.net.cn 提问或用邮件和作者联系
****************************************************************************
*/
#include "fun.h"
#include "os.h"
#include "global.h"
//extern uint8_t OS_LOCAL_ADDRESS;
/*uint16_t __attribute((__progmem__)) crcTable[256] = {
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 };
*/
static uint16_t RandomLFSR_shiftReg;
static uint16_t RandomLFSR_initSeed;
static uint16_t RandomLFSR_mask;
static bool HPLPowerManagementM_disabled = TRUE;
enum {
HPLPowerManagementM_IDLE = 0,
HPLPowerManagementM_ADC_NR = 1 << 3,
HPLPowerManagementM_POWER_DOWN = 1 << 4,
HPLPowerManagementM_POWER_SAVE = (1 << 3) + (1 << 4),
HPLPowerManagementM_STANDBY = (1 << 2) + (1 << 4),
HPLPowerManagementM_EXT_STANDBY = (1 << 3) + (1 << 4) + (1 << 2)
};
void OSH_SET_GREEN_LED_PIN(void)
{
* (volatile unsigned char *)(0x1B + 0x20) |= 1 << 1;
}
void OSH_SET_YELLOW_LED_PIN(void)
{
* (volatile unsigned char *)(0x1B + 0x20) |= 1 << 0;
}
void OSH_SET_RED_LED_PIN(void)
{
* (volatile unsigned char *)(0x1B + 0x20) |= 1 << 2;
}
void OSH_SET_FLASH_SELECT_PIN(void)
{
* (volatile unsigned char *)(0x1B + 0x20) |= 1 << 3;
}
void OSH_MAKE_FLASH_CLK_OUTPUT(void)
{
* (volatile unsigned char *)(0x11 + 0x20) |= 1 << 5;
}
void OSH_MAKE_FLASH_OUT_OUTPUT(void)
{
* (volatile unsigned char *)(0x11 + 0x20) |= 1 << 3;
}
void OSH_MAKE_FLASH_SELECT_OUTPUT(void)
{
* (volatile unsigned char *)(0x1A + 0x20) |= 1 << 3;
}
void OSH_CLR_SERIAL_ID_PIN(void)
{
* (volatile unsigned char *)(0x1B + 0x20) &= ~(1 << 4);
}
void OSH_MAKE_SERIAL_ID_INPUT(void)
{
* (volatile unsigned char *)(0x1A + 0x20) &= ~(1 << 4);
}
void OSH_MAKE_SPI_OC1C_INPUT(void)
{
* (volatile unsigned char *)(0x17 + 0x20) &= ~(1 << 7);
}
void OSH_MAKE_MISO_INPUT(void)
{
* (volatile unsigned char *)(0x17 + 0x20) &= ~(1 << 3);
}
void OSH_MAKE_CC_PCLK_OUTPUT(void)
{
* (volatile unsigned char *)(0x11 + 0x20) |= 1 << 6;
}
void OSH_MAKE_CC_PDATA_OUTPUT(void)
{
* (volatile unsigned char *)(0x11 + 0x20) |= 1 << 7;
}
void OSH_MAKE_CC_PALE_OUTPUT(void)
{
* (volatile unsigned char *)(0x11 + 0x20) |= 1 << 4;
}
void OSH_MAKE_PW0_OUTPUT(void)
{
* (volatile unsigned char *)(0x14 + 0x20) |= 1 << 0;
}
void OSH_MAKE_PW1_OUTPUT(void)
{
* (volatile unsigned char *)(0x14 + 0x20) |= 1 << 1;
}
void OSH_MAKE_PW2_OUTPUT(void)
{
* (volatile unsigned char *)(0x14 + 0x20) |= 1 << 2;
}
void OSH_MAKE_PW3_OUTPUT(void)
{
* (volatile unsigned char *)(0x14 + 0x20) |= 1 << 3;
}
void OSH_MAKE_PW4_OUTPUT(void)
{
* (volatile unsigned char *)(0x14 + 0x20) |= 1 << 4;
}
void OSH_MAKE_PW5_OUTPUT(void)
{
* (volatile unsigned char *)(0x14 + 0x20) |= 1 << 5;
}
void OSH_MAKE_PW6_OUTPUT(void)
{
* (volatile unsigned char *)(0x14 + 0x20) |= 1 << 6;
}
void OSH_MAKE_PW7_OUTPUT(void)
{
* (volatile unsigned char *)(0x14 + 0x20) |= 1 << 7;
}
void OSH_MAKE_CC_CHP_OUT_INPUT(void)
{
* (volatile unsigned char *)(0x1A + 0x20) &= ~(1 << 6);
}
void OSH_MAKE_GREEN_LED_OUTPUT(void)
{
* (volatile unsigned char *)(0x1A + 0x20) |= 1 << 1;
}
void OSH_MAKE_YELLOW_LED_OUTPUT(void)
{
* (volatile unsigned char *)(0x1A + 0x20) |= 1 << 0;
}
void OSH_MAKE_RED_LED_OUTPUT(void)
{
* (volatile unsigned char *)(0x1A + 0x20) |= 1 << 2;
}
result_t RandomInit(void)
{
uint8_t random = OS_LOCAL_ADDRESS;
{ uint8_t atomic = AtomicStart();
{
//RandomLFSR_shiftReg = (119 * 119 * (OS_LOCAL_ADDRESS + 1)&0xffff);
RandomLFSR_shiftReg = 119 * 119 * (random + 1);
RandomLFSR_initSeed = RandomLFSR_shiftReg;
//RandomLFSR_mask = 137 * 29 * (OS_LOCAL_ADDRESS + 1);
RandomLFSR_mask = 137 * 29 * (random + 1);
}
AtomicEnd(atomic); }
return SUCCESS;
}
void OSH_SET_CC_PCLK_PIN(void)
{
* (volatile unsigned char *)(0x12 + 0x20) |= 1 << 6;
}
void OSH_SET_CC_PDATA_PIN(void)
{
* (volatile unsigned char *)(0x12 + 0x20) |= 1 << 7;
}
void OSH_SET_CC_PALE_PIN(void)
{
* (volatile unsigned char *)(0x12 + 0x20) |= 1 << 4;
}
void OSH_MAKE_MOSI_INPUT(void)
{
* (volatile unsigned char *)(0x17 + 0x20) &= ~(1 << 2);
}
void OSH_MAKE_SPI_SCK_INPUT(void)
{
* (volatile unsigned char *)(0x17 + 0x20) &= ~(1 << 1);
}
void OSH_CLR_CC_PALE_PIN(void)
{
* (volatile unsigned char *)(0x12 + 0x20) &= ~(1 << 4);
}
void OSH_CLR_CC_PDATA_PIN(void)
{
* (volatile unsigned char *)(0x12 + 0x20) &= ~(1 << 7);
}
void OSH_CLR_CC_PCLK_PIN(void)
{
* (volatile unsigned char *)(0x12 + 0x20) &= ~(1 << 6);
}
void OSH_MAKE_CC_PDATA_INPUT(void)
{
* (volatile unsigned char *)(0x11 + 0x20) &= ~(1 << 7);
}
int OSH_READ_CC_PDATA_PIN(void)
{
return (* (volatile unsigned char *)(0x10 + 0x20) & (1 << 7)) != 0;
}
uint8_t GetPowerLevel(void)
{
uint8_t diff;
if (* (volatile unsigned char *)(0x37 + 0x20) & ~((1 << 1) | (1 << 0))) {
return HPLPowerManagementM_IDLE;
}
else {
if (* (volatile unsigned char *)(0x0D + 0x20) & (1 << 7)) {
return HPLPowerManagementM_IDLE;
}
else {
if (* (volatile unsigned char *)(0x06 + 0x20) & (1 << 7)) {
return HPLPowerManagementM_ADC_NR;
}
else {
if (* (volatile unsigned char *)(0x37 + 0x20) & ((1 << 1) | (1 << 0))) {
diff = * (volatile unsigned char *)(0x31 + 0x20) - * (volatile unsigned char *)(0x32 + 0x20);
if (diff < 16) {
return HPLPowerManagementM_EXT_STANDBY;
}
return HPLPowerManagementM_POWER_SAVE;
}
else
{
return HPLPowerManagementM_POWER_DOWN;
}
}
}
}
}
void PowerAdjustment(void)
{
uint8_t foo;
uint8_t mcu;
foo = GetPowerLevel();
mcu = * (volatile unsigned char *)(0x35 + 0x20);
mcu &= 0xe3;
if (foo == HPLPowerManagementM_EXT_STANDBY || foo == HPLPowerManagementM_POWER_SAVE) {
mcu |= HPLPowerManagementM_IDLE;
while ((* (volatile unsigned char *)(0x30 + 0x20) & 0x7) != 0) {
asm volatile ("nop");}
mcu &= 0xe3;
}
mcu |= foo;
* (volatile unsigned char *)(0x35 + 0x20) = mcu;
* (volatile unsigned char *)(0x35 + 0x20) |= 1 << 5;
}
uint8_t PowerManagementAdjust(void)
{
uint8_t mcu;
if (!HPLPowerManagementM_disabled) {
OSPostTask(PowerAdjustment);
}
else
{
mcu = * (volatile unsigned char *)(0x35 + 0x20);
mcu &= 0xe3;
mcu |= HPLPowerManagementM_IDLE;
* (volatile unsigned char *)(0x35 + 0x20) = mcu;
* (volatile unsigned char *)(0x35 + 0x20) |= 1 << 5;
}
return 0;
}
void OSH_CLR_YELLOW_LED_PIN(void)
{
* (volatile unsigned char *)(0x1B + 0x20) &= ~(1 << 0);
}
void OSH_MAKE_MOSI_OUTPUT(void)
{
* (volatile unsigned char *)(0x17 + 0x20) |= 1 << 2;
}
void OSH_MAKE_MISO_OUTPUT(void)
{
* (volatile unsigned char *)(0x17 + 0x20) |= 1 << 3;
}
void OSH_CLR_RED_LED_PIN(void)
{
* (volatile unsigned char *)(0x1B + 0x20) &= ~(1 << 2);
}
void OSH_CLR_GREEN_LED_PIN(void)
{
* (volatile unsigned char *)(0x1B + 0x20) &= ~(1 << 1);
}
/*uint16_t crcByte(uint16_t oldCrc, uint8_t byte)
{
uint16_t *table = crcTable;
uint16_t newCrc;
asm ("eor %1,%B3\n"
"\tlsl %1\n"
"\tadc %B2, __zero_reg__\n"
"\tadd %A2, %1\n"
"\tadc %B2, __zero_reg__\n"
"\tlpm\n"
"\tmov %B0, %A3\n"
"\tmov %A0, r0\n"
"\tadiw r30,1\n"
"\tlpm\n"
"\teor %B0, r0" :
"=r"(newCrc), "+r"(byte), "+z"(table) : "r"(oldCrc));
return newCrc;
}
*/
uint16_t RandomLFSRGen(void)
{
bool endbit;
uint16_t tmpShiftReg;
{ uint8_t atomic = AtomicStart();
{
tmpShiftReg = RandomLFSR_shiftReg;
endbit = (tmpShiftReg & 0x8000) != 0;
tmpShiftReg <<= 1;
if (endbit) {
tmpShiftReg ^= 0x100b;
}
tmpShiftReg++;
RandomLFSR_shiftReg = tmpShiftReg;
tmpShiftReg = tmpShiftReg ^ RandomLFSR_mask;
}
AtomicEnd(atomic); }
return tmpShiftReg;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -