コード例 #1
0
/**
\brief Test case: TC_CoreFunc_PRIMASK
\details
- Check if __get_PRIMASK and __set_PRIMASK intrinsic can be used to manipulate PRIMASK.
- Check if __enable_irq and __disable_irq are reflected in PRIMASK.
*/
void TC_CoreFunc_PRIMASK (void) {
  uint32_t orig = __get_PRIMASK();

  // toggle primask
  uint32_t primask = (orig & ~0x01U) | (~orig & 0x01U);

  __set_PRIMASK(primask);
  uint32_t result = __get_PRIMASK();

  ASSERT_TRUE(result == primask);

  __disable_irq();
  result = __get_PRIMASK();
  ASSERT_TRUE((result & 0x01U) == 1U);

  __enable_irq();
  result = __get_PRIMASK();
  ASSERT_TRUE((result & 0x01U) == 0U);

  __disable_irq();
  result = __get_PRIMASK();
  ASSERT_TRUE((result & 0x01U) == 1U);

  __set_PRIMASK(orig);
}
コード例 #2
0
ファイル: bsp_FileSystem.c プロジェクト: CaptainJe/BlueShiled
//void SD_TEST(void)
//{
//	u8 res;
//	UINT bw,index;
//	res=f_mount( &fatfs_SDCARD,"0:/",1 );
//	res=f_open(&file_sdif, "0:/sdif.dat",FA_OPEN_EXISTING|FA_WRITE|FA_READ);
//	res=f_write(&file_sdif,SDTEST_WriteBuffer,512,&bw);
//	res=f_close(&file_sdif);
//	res=f_open(&file_sdif, "0:/sdif.dat",FA_OPEN_EXISTING |FA_WRITE);
//	res=f_write(&file_sdif,SDTEST_WriteBuffer,512,&bw);
//	res=f_close(&file_sdif);
//	res=f_open(&file_sdif, "0:/sdif.dat",FA_OPEN_EXISTING | FA_READ);
//	index=0;
//	while(SDTEST_ReadBuffer[31]!=0x04)
//	{
//		index++;
//		res=f_read(&file_sdif,SDTEST_ReadBuffer,512,&bw);
//	}
//	f_close(&file_sdif);      
//	
//	
//}
u8 bsp_ChangeAPPtoRun(u8 App_Select)
{
  u8 status=0;
	u8 Flash_status=0;
	FLASH_Unlock();									//解锁 
  FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存
 	FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_OPERR|FLASH_FLAG_WRPERR|  FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);
	status=FLASH_EraseSector(FLASH_Sector_3 ,VoltageRange_3);//VCC=2.7~3.6V之间!!

	if(status==FLASH_COMPLETE)
	{
   __set_PRIMASK(1);  
	status=FLASH_ProgramByte(App_ToRun_Flag,App_Select);  //SysID
   __set_PRIMASK(0);  
	}
  FLASH_DataCacheCmd(ENABLE);	//FLASH擦除结束,开启数据缓存
	FLASH_Lock();//上锁	
	if(status==FLASH_COMPLETE)
	{
		Flash_status=0;
	}
	else
	{
		Flash_status=status;
	}
	return Flash_status;
		
}
コード例 #3
0
ファイル: bsp_FileSystem.c プロジェクト: CaptainJe/BlueShiled
u8* bsp_Firmware_Write(u8* writebuffer,u32 writeaddress,u16 writelength)
{	
	
	u8 status=0;
	u16 index=0;
	SleepTime=0;
  FLASH_Unlock();									//解锁 
  FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存
 	FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_OPERR|FLASH_FLAG_WRPERR|  FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);
	
   __set_PRIMASK(1);  
		  for(index=0;index<writelength;index++)
		{
			status=FLASH_ProgramByte(writeaddress+index,writebuffer[index]);  
		}
   __set_PRIMASK(0);  

	
  FLASH_DataCacheCmd(ENABLE);	//FLASH擦除结束,开启数据缓存
	FLASH_Lock();//上锁	
	if(status==FLASH_COMPLETE)
	{
		MCU_WriteStatus=0;
	}
	else
	{
		MCU_WriteStatus=status;
	}
	return &MCU_WriteStatus;
		
}
コード例 #4
0
ファイル: td_spi.c プロジェクト: jeromegros/TD1208
/***************************************************************************//**
 * @brief
 *   Try to lock the given SPI bus.
 *
 * @param[in] id
 *   The unique ID used for SPI bus locking.
 *
 * @param[in] callback
 *   Pointer to the call-back function that will be called when the bus is unlocked.
 *
 * @return
 * 	 true if bus was successfully locked, false otherwise
 ******************************************************************************/
bool TD_SPI_Lock(uint8_t id, TD_SPI_LockedCallback callback)
{
	uint8_t msk, ret, top, bus;

	DEBUG_PRINTF("Lck%d\r\n", id);
	EFM_ASSERT(id <= CONFIG_MAX_SPI_ID);
	bus = TD_SPI_Conf[id].bus;
	EFM_ASSERT(bus < MAX_SPI_BUS);
	EFM_ASSERT(SPI[bus].lock != 0xFF);
	msk = __get_PRIMASK();
	if (!msk) {
		__set_PRIMASK(1);
	}

	// We have already locked this bus for this usage, just increment lock count
	if (SPI[bus].lock && (SPI[bus].lock_id == id || SPI[bus].lock_id == TD_SPI_Conf[id].friend_id)) {
		SPI[bus].lock++;
		ret = true;

		// Bus is not actually locked, lock it
	} else if (!SPI[bus].lock) {
		SPI[bus].lock_id = id;
		SPI[bus].lock = 1;
		TD_SPI_UpdateConf(id);
		ret = true;
	} else {

		// Bus is locked, but for another usage
		if (callback) {

			// We should append callback to queue
			top = SPI[bus].top + 1;
			if (top >= MAX_LOCKED_CALLBACK) {
				top = 0;
			}

			// Enough room
			if (top != SPI[bus].bottom) {
				SPI[bus].cb[SPI[bus].top] = callback;

#ifdef SPI_DEBUG_STAMP
				SPI[bus].lock_stamp[SPI[bus].top] = RTC->CNT;
#endif

				SPI[bus].top = top;
			} else {
				TD_Trap(TRAP_SPI_MAX_LOCK, (bus << 8) | id);
			}
			DEBUG_PRINTF("Lock add 0x%08X, lbyid:%d cnt:%d\r\n", callback, SPI[bus].lock_id, SPI[bus].lock);
		}
		ret = false;
	}
	DEBUG_PRINTF_INFO("Cnt%d\r\n", SPI[bus].lock);
	if (!msk) {
		__set_PRIMASK(0);
	}
	return ret;
}
コード例 #5
0
ファイル: USB_VirtualCOM.c プロジェクト: Blop1759/evic-sdk
/**
 * Sends a data buffer asynchronously over the USB virtual COM port.
 * This is an internal function.
 *
 * @param buf  Data buffer.
 * @param size Number of bytes to send.
 */
static void USB_VirtualCOM_SendAsync(const uint8_t *buf, uint32_t size) {
	USB_VirtualCOM_TxTransfer_t *transfer;
	uint32_t partialSize;

	if(size == 0) {
		return;
	}

	// Enter critical section
	__set_PRIMASK(1);

	partialSize = 0;
	if(USB_VirtualCOM_bulkInWaiting) {
		// Transfer first packet right away
		// If size is a multiple of USB_VCOM_BULK_IN_MAX_PKT_SIZE it will stay that way
		partialSize = Minimum(size, USB_VCOM_BULK_IN_MAX_PKT_SIZE);
		USB_VirtualCOM_SendBulkInPayload(buf, partialSize);
		buf += partialSize;
		size -= partialSize;
	}

	if(partialSize != 0 && partialSize < USB_VCOM_BULK_IN_MAX_PKT_SIZE) {
		// We already transferred the whole packet
		__set_PRIMASK(0);
		return;
	}

	// Allocate memory for transfer + buffer
	// If the buffer was exactly USB_VCOM_BULK_IN_MAX_PKT_SIZE bytes and
	// it has already been transferred, the transfer info still needs to be
	// allocated for the bulk IN handler to send the zero packet.
	transfer = (USB_VirtualCOM_TxTransfer_t *) malloc(sizeof(USB_VirtualCOM_TxTransfer_t) + size);
	if(transfer == NULL) {
		__set_PRIMASK(0);
		return;
	}

	// Fill in transfer data
	transfer->next = NULL;
	transfer->size = size;
	transfer->txSize = 0;
	if(size != 0) {
		memcpy(transfer->buffer, buf, size);
	}

	// Append transfer to queue
	if(USB_VirtualCOM_txQueue.head == NULL) {
		USB_VirtualCOM_txQueue.head = USB_VirtualCOM_txQueue.tail = transfer;
	}
	else {
		USB_VirtualCOM_txQueue.tail->next = transfer;
		USB_VirtualCOM_txQueue.tail = transfer;
	}

	// Exit critical section
	__set_PRIMASK(0);
}
コード例 #6
0
ファイル: USB_VirtualCOM.c プロジェクト: Blop1759/evic-sdk
uint16_t USB_VirtualCOM_Read(uint8_t *buf, uint16_t size) {
	uint16_t readSize;

	// Read in critical section
	__set_PRIMASK(1);
	readSize = USB_VirtualCOM_RxBuffer_Read(buf, size);
	__set_PRIMASK(0);

	return readSize;
}
コード例 #7
0
ファイル: bsp_timer.c プロジェクト: Nikola-JK/test_project
/*
*********************************************************************************************************
*	函 数 名: bsp_GetRunTime
*	功能说明: 获取CPU运行时间,单位10ms
*	形    参:无
*	返 回 值: CPU运行时间,单位10ms
*********************************************************************************************************
*/
int32_t bsp_GetRunTime(void)
{
	int runtime; 

	__set_PRIMASK(1);  		/* 关中断 */
	
	runtime = g_iRunTime;	/* 由于在Systick中断被改写,因此关中断进行保护 */
		
	__set_PRIMASK(0);  		/* 开中断 */

	return runtime;
}
コード例 #8
0
ファイル: main.c プロジェクト: writeing/TW3-16
void System_Init ( void )
{
    __set_PRIMASK ( 1 );	//¹Ø±Õ×ÜÖжÏ
    SYS_Init();
    IO_Init();
    I2C_Init();
    // WDT_Init();
    UART1_Init();
    ADC_Init();
    TMR0_Init();
    __set_PRIMASK ( 0 );
}
コード例 #9
0
ファイル: bsp_cpu_flash.c プロジェクト: Tanmingtian/YH
/*
*********************************************************************************************************
*	函 数 名: bsp_WriteCpuFlash
*	功能说明: 写数据到CPU 内部Flash。
*	形    参: _ulFlashAddr : Flash地址
*			 _ucpSrc : 数据缓冲区
*			 _ulSize : 数据大小(单位是字节)
*	返 回 值: 0-成功,1-数据长度或地址溢出,2-写Flash出错(估计Flash寿命到)
*********************************************************************************************************
*/
uint8_t bsp_WriteCpuFlash(uint32_t _ulFlashAddr, uint8_t *_ucpSrc, uint32_t _ulSize)
{
	uint32_t i;
	uint8_t ucRet;

	/* 如果偏移地址超过芯片容量,则不改写输出缓冲区 */
	if (_ulFlashAddr + _ulSize > FLASH_BASE_ADDR + FLASH_SIZE)
	{
		return 1;
	}

	/* 长度为0时不继续操作  */
	if (_ulSize == 0)
	{
		return 0;
	}

	ucRet = bsp_CmpCpuFlash(_ulFlashAddr, _ucpSrc, _ulSize);

	if (ucRet == FLASH_IS_EQU)
	{
		return 0;
	}

	__set_PRIMASK(1);  		/* 关中断 */

	/* FLASH 解锁 */
	FLASH_Unlock();

  	/* Clear pending flags (if any) */
	FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
                  FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);

	/* 需要擦除 */
	if (ucRet == FLASH_REQ_ERASE)
	{
		FLASH_EraseSector(bsp_GetSector(_ulFlashAddr), VoltageRange_3);
	}

	/* 按字节模式编程(为提高效率,可以按字编程,一次写入4字节) */
	for (i = 0; i < _ulSize; i++)
	{
		FLASH_ProgramByte(_ulFlashAddr++, *_ucpSrc++);
	}

  	/* Flash 加锁,禁止写Flash控制寄存器 */
  	FLASH_Lock();

  	__set_PRIMASK(0);  		/* 开中断 */

	return 0;
}
コード例 #10
0
ファイル: bsp_timer.c プロジェクト: Nikola-JK/test_project
/*
*********************************************************************************************************
*	函 数 名: bsp_StartTimer
*	功能说明: 启动一个定时器,并设置定时周期。
*	形    参:	_id     : 定时器ID,值域【1,TMR_COUNT-1】。用户必须自行维护定时器ID,以避免定时器ID冲突。
*						  定时器ID = 0 已用于bsp_DelayMS()函数
*				_period : 定时周期,单位1ms
*	返 回 值: 无
*********************************************************************************************************
*/
void bsp_StartTimer(uint8_t _id, uint32_t _period)
{
	if (_id >= TMR_COUNT)
	{
		/* while(1); 死机 */
		return;
	}

	__set_PRIMASK(1);  		/* 关中断 */
	g_Tmr[_id].count = _period;
	g_Tmr[_id].flag = 0;
	__set_PRIMASK(0);  		/* 开中断 */
}
コード例 #11
0
ファイル: td_spi.c プロジェクト: jeromegros/TD1208
/***************************************************************************//**
 * @brief
 *   Unlock the given SPI bus.
 *
 * @param[in] id
 *   The unique ID used for SPI bus locking.
 ******************************************************************************/
void TD_SPI_UnLock(uint8_t id)
{
	TD_SPI_LockedCallback temp;
	uint32_t msk;
	uint8_t bus;

	EFM_ASSERT(id <= CONFIG_MAX_SPI_ID);
	bus = TD_SPI_Conf[id].bus;
	EFM_ASSERT(bus < MAX_SPI_BUS);
	EFM_ASSERT(SPI[bus].lock && SPI[bus].lock_id == id);
	DEBUG_PRINTF("UnL%d\r\n", id);
	DEBUG_PRINTF_INFO("Cnt%d\r\n", SPI[bus].lock);
	msk = __get_PRIMASK();
	__set_PRIMASK(1);
	if (SPI[bus].lock && (SPI[bus].lock_id == id || SPI[bus].lock_id == TD_SPI_Conf[id].friend_id)) {

		// Bus not locked, and no flushing of queue in callstack
		if ((--SPI[bus].lock) == 0 && !SPI[bus].flush_in_progress) {

			// Now, we are flushing queue
			SPI[bus].flush_in_progress = true;

			// Process all callback to flush in queue
			while (SPI[bus].top != SPI[bus].bottom) {

				// There is callback to call, get it
				temp = SPI[bus].cb[SPI[bus].bottom];

				// Remove it
				SPI[bus].bottom++;
				if (SPI[bus].bottom >= MAX_LOCKED_CALLBACK) {
					SPI[bus].bottom = 0;
				}
				__set_PRIMASK(msk);

				// Call it, IRQ available if needed
				DEBUG_PRINTF("Lock feed 0x%08X\r\n", temp);
				(*temp)();
				msk = __get_PRIMASK();
				__set_PRIMASK(1);
			}
			SPI[bus].flush_in_progress = false;
		}
	} else {
		TD_Trap(TRAP_SPI_INVALID_UNLOCK, (bus << 8) | id);
	}
	__set_PRIMASK(msk);
}
コード例 #12
0
ファイル: initcpuc.c プロジェクト: Mars-Wu/djyos
void Init_Cpu(void)
{
    __set_PSP((uint32_t)msp_top);
    __set_PRIMASK(1);
    __set_FAULTMASK(1);
    __set_CONTROL(0);

    #if (CN_CPU_OPTIONAL_FPU == 1)
        pg_scb_reg->CPACR = (3UL << 20)|(3UL << 22);    //使能FPU
        pg_scb_reg->FPCCR = (1UL << 31);                //关闭lazy stacking
    #endif
    switch(pg_scb_reg->CPUID)
    {
//        case cn_revision_r0p1://todo
//            break;    //好像没什么要做的
    }

    extern void WDT_Disable(void);
    WDT_Disable();  //关狗

    extern void SysClockInit(void);
    SysClockInit();

    extern void SDRAM_Init(void);
    SDRAM_Init();

    extern void Cache_Init(void);
    Cache_Init();

    Load_Preload();
}
コード例 #13
0
ファイル: ldrom_main.c プロジェクト: brucetsao/Nuvoton
int main()
{
    /* Unlock protected register */
    SYS_UnlockReg();

    SYS_Init();
    UART_Init();

    printf("\n\n");
    printf("M451 FMC IAP Sample Code [LDROM code]\n");

    /* Enable FMC ISP function */
    FMC_Open();

    printf("\n\nPress any key to branch to APROM...\n");
    getchar();

    printf("\n\nChange VECMAP and branch to LDROM...\n");
    UART_WAIT_TX_EMPTY(UART0);

    /* Mask all interrupt before changing VECMAP to avoid wrong interrupt handler fetched */
    __set_PRIMASK(1);

    /* Change VECMAP for booting to APROM */
    FMC_SetVectorPageAddr(FMC_APROM_BASE);

    /* Lock protected Register */
    SYS_LockReg();

    /* Software reset to boot to APROM */
    NVIC_SystemReset();

    while(1);
}
コード例 #14
0
ファイル: bsp_FileSystem.c プロジェクト: CaptainJe/BlueShiled
u8* bsp_MCU_Read(u8 blockid,u16 readlength)
{
	__set_PRIMASK(1);  
	SleepTime=0;
	if(blockid==1)
	{
		memcpy(&MCU_ROM_Read[1],(u8*)ADDR_FLASH_SECTOR_7,readlength);
	}
	if(blockid==2)
	{
		memcpy(&MCU_ROM_Read[1],(u8*)(ADDR_FLASH_SECTOR_7+512),readlength);
	}
	MCU_ROM_Read[0]=0;
	__set_PRIMASK(0);  
	return MCU_ROM_Read;
}
コード例 #15
0
ファイル: initcpuc.c プロジェクト: djyos/djyos
void Init_Cpu(void)
{
    __set_PSP((uint32_t)msp_top);
    __set_PRIMASK(1);
    __set_FAULTMASK(1);
    __set_CONTROL(0);

    #if (CN_CPU_OPTIONAL_FPU == 1)
    startup_scb_reg->CPACR = (3UL << 20)|(3UL << 22);    //使能FPU
    startup_scb_reg->FPCCR = (1UL << 31);                //关闭lazy stacking
    #endif
    switch(startup_scb_reg->CPUID)
    {
    }

    extern void SysClockInit(void);
    SysClockInit();

#ifdef USE_HAL_DRIVER
    HAL_TickInit();
#endif

    extern void SRAM_Init(void);
    SRAM_Init();

    IAP_SelectLoadProgam();
}
コード例 #16
0
ファイル: port.c プロジェクト: mikewang01/hicling_replant
uint32_t ulSetInterruptMaskFromISR( void )
{
        uint32 primask = __get_PRIMASK();
        __set_PRIMASK(1);
        DBG_CONFIGURE_HIGH(CMN_TIMING_DEBUG, CMNDBG_CRITICAL_SECTION);
        return primask;
}
コード例 #17
0
ファイル: flash.c プロジェクト: JohnsonShen/NuBrick
//============================================================================
// u32addr : 0-1024  
//============================================================================
uint32_t DATA_FLASH_Read(uint32_t u32add)
{
	uint32_t u32data;
#ifdef M451
	u32data = FMC_Read(u32add*4+DATA_Flash_Start_ADD);
#else
	__set_PRIMASK(1);
	UNLOCKREG();
	DrvFMC_EnableISP();
	DrvFMC_Read(u32add*4+DATA_Flash_Start_ADD, &u32data);
	DrvFMC_DisableISP(); 
	LOCKREG();
	__set_PRIMASK(0);
#endif
	return u32data;
}
コード例 #18
0
ファイル: port.c プロジェクト: mikewang01/hicling_replant
void vClearInterruptMaskFromISR( uint32_t ulMask )
{
        if (!ulMask) {
                DBG_CONFIGURE_LOW(CMN_TIMING_DEBUG, CMNDBG_CRITICAL_SECTION);
        }
        __set_PRIMASK(ulMask);
}
コード例 #19
0
ファイル: system.c プロジェクト: art103/ar-t6
/**
  * @brief  calls Stm32F1xx on-chip bootloader for flashing
  * @param  None
  * @retval None - shall not ever return
  */
void enter_bootloader(void) {
	USART_DeInit(USART1);
	RCC_DeInit();
	SysTick->CTRL = 0;
	SysTick->LOAD = 0;
	SysTick->VAL = 0;

	__ASM volatile (
			"MOVS r4,#1\n"
			"MSR primask, r4\n"
			"LDR r4,=#0x1FFFF000\n"
			"LDR r3,[r4]\n"
			"MSR msp,r3\n"
			"LDR r3,[r4, #4]\n"
			"blx r3\n"
	);
	 // the above ASM does the same but is much shorter
	// and does not need core_cm3.c (for the __set_XXXX())
	#if 0
	__set_PRIMASK(1);
	// changing stack point would invalidate all local var on stack!
	#define SYSMEM ((uint32_t*)0x1FFFF000) /*specific to STM32F1xx*/
	register const uint32_t SP = SYSMEM[0];
	__set_MSP(SYSMEM[0]/*sp addr*/);
	register const uint32_t BL = SYSMEM[1];
	typedef void (*BLFUNC)();
	((BLFUNC)SYSMEM[1]/*bootloader addr*/)();
	#endif
}
コード例 #20
0
ファイル: bsp_FileSystem.c プロジェクト: CaptainJe/BlueShiled
u8* bsp_MCU_Write(u8* writebuffer,u8 blockid,u16 writelength)
{	
	
	u8 status=0;
	u16 index=0;
	SleepTime=0;
	__set_PRIMASK(1);  
	memcpy(MCU_ROM_Write,(u8*)ADDR_FLASH_SECTOR_7,1024+16); //在擦除之前,先把数据读出来放在内存buffer
	__set_PRIMASK(0);  
	
  if(blockid==1)
	{
		memcpy(MCU_ROM_Write,writebuffer,writelength); //将512byte数据写入第一个block区域
	}
	if(blockid==2)
	{
		memcpy(MCU_ROM_Write+512,writebuffer,writelength); //将512byte数据写入第二个block区域
	}
	
	FLASH_Unlock();									//解锁 
  FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存
 	FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_OPERR|FLASH_FLAG_WRPERR|  FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);
	status=FLASH_EraseSector(FLASH_Sector_7 ,VoltageRange_3);//VCC=2.7~3.6V之间!!

	if(status==FLASH_COMPLETE)
	{
   __set_PRIMASK(1);  
		  for(index=0;index<(1024+16);index++)
		{
			status=FLASH_ProgramByte(ADDR_FLASH_SECTOR_7+index,MCU_ROM_Write[index]);  //SysID
		}
   __set_PRIMASK(0);  
	}
	
  FLASH_DataCacheCmd(ENABLE);	//FLASH擦除结束,开启数据缓存
	FLASH_Lock();//上锁	
	if(status==FLASH_COMPLETE)
	{
		MCU_WriteStatus=0;
	}
	else
	{
		MCU_WriteStatus=status;
	}
	return &MCU_WriteStatus;
		
}
コード例 #21
0
ファイル: atomic.c プロジェクト: t-riffel/EHAL
int __atomic_fetch_sub_4(int *d, int val, int mem)
{
	uint32_t primask = __get_PRIMASK();
	__disable_irq();
	*d -= val;
	__set_PRIMASK(primask);

	return *d;
}
コード例 #22
0
ファイル: System.cpp プロジェクト: ThBreuer/EmbSysLib
//-------------------------------------------------------------------
void cSystem::enableInterrupt( void )
{
  if(cntInterrupt > 0)
  {
    cntInterrupt--;
  }
  if(cntInterrupt == 0)
  {
     __set_PRIMASK(0); //__enable_irq();
  }
}
コード例 #23
0
ファイル: nrf_gzp.c プロジェクト: Abdellbar/nrf51
/**
* @brief Function for setting the Primask variable. Only necessary if ARMCC
* compiler skips __set_PRIMASK at high optimization levels. 
*
* @param primask The primask value. 1 to disable interrupts, 0 otherwise.
*/
static void nrf_gzp_set_primask(uint32_t primask)
{
    #if defined(__CC_ARM)
    //lint -save -e10 -e618 -e438 -e550 -e526 -e628 -e526
    volatile register uint32_t __regPriMask         __ASM("primask");
    __regPriMask = (primask);
    #else
    __set_PRIMASK(primask);
    #endif
    //lint -restore
}
コード例 #24
0
ファイル: FlashCtrl.c プロジェクト: JohnsonShen/ABRobot
//============================================================================
// DATA FLASH OPERATION
// u32addr : 0-1024 (For 4KBytes Data Flash)
// u32data : 0-0xFFFFFFFF (4Bytes)
//============================================================================
void DATA_FLASH_Write(uint32_t u32addr,uint32_t u32data)
{
    uint32_t i=0;
#ifdef M451
    SYS_UnlockReg();
    FMC_Open();

    for(i=0; i<PAGE_SIZE; i++)
        data_buff[i] = FMC_Read(DATA_Flash_Start_ADD+i*4+ u32addr/PAGE_SIZE*2048);

    FMC_Erase(DATA_Flash_Start_ADD+u32addr/PAGE_SIZE*2048);
    data_buff[u32addr%PAGE_SIZE]=u32data;

    for(i=0; i<PAGE_SIZE; i++)
        FMC_Write(DATA_Flash_Start_ADD+i*4+ u32addr/PAGE_SIZE*2048, data_buff[i]);

    FMC_Close();
    SYS_LockReg();
#else
    uint32_t data_buff[PAGE_SIZE];
    __set_PRIMASK(1);//Avoid interrupt

    UNLOCKREG();
    DrvFMC_EnableISP();

    for(i=0; i<PAGE_SIZE; i++)
        DrvFMC_Read(DATA_Flash_Start_ADD+i*4+ u32addr/128*512, &data_buff[i]);

    DrvFMC_Erase(DATA_Flash_Start_ADD+u32addr/128*512);

    data_buff[u32addr%128]=u32data;

    for(i=0; i<PAGE_SIZE; i++)
        DrvFMC_Write(DATA_Flash_Start_ADD+i*4+ u32addr/128*512, data_buff[i]);

    DrvFMC_DisableISP();
    LOCKREG();
    __set_PRIMASK(0);
#endif

}
コード例 #25
0
int32_t DrvFMC_Erase(uint32_t u32addr)
{
    FMC->ISPCMD.FCTRL = 2;
    FMC->ISPCMD.FCEN = 0;
    FMC->ISPCMD.FOEN = 1;
    FMC->ISPADR = u32addr;
    __set_PRIMASK(1);
    FMC->ISPTRG.ISPGO = 1;  
    __ISB();
    while (FMC->ISPTRG.ISPGO);  
    __set_PRIMASK(0);
    
    if (FMC->ISPCON.ISPFF == 1)
    {
        FMC->ISPCON.ISPFF = 1;
//        return E_DRVFMC_ERR_ISP_FAIL;
		return 0;
    }
    
    return 0;
}
コード例 #26
0
void restoreInterruptMasking(const InterruptMask interruptMask)
{
#if CONFIG_ARCHITECTURE_ARMV7_M_KERNEL_BASEPRI != 0

	__set_BASEPRI(interruptMask);

#else	// CONFIG_ARCHITECTURE_ARMV7_M_KERNEL_BASEPRI == 0

	__set_PRIMASK(interruptMask);

#endif	// CONFIG_ARCHITECTURE_ARMV7_M_KERNEL_BASEPRI == 0
}
コード例 #27
0
void bootloader (void) {
  
  SysBootLoader = (void (*)(void)) (*((u32 *) 0x1fff0004));

  RCC_DeInit();
  SysTick->CTRL = 0;
  SysTick->LOAD = 0;
  SysTick->VAL = 0;
  __set_PRIMASK(1);
  __set_MSP(0x20001000);
  SysBootLoader();
}
コード例 #28
0
ファイル: initcpuc.c プロジェクト: Mars-Wu/djyos
void Init_Cpu(void)
{
    __set_PSP((uint32_t)msp_top);
    __set_PRIMASK(1);
    __set_FAULTMASK(1);
    __set_CONTROL(0);
    switch(pg_scb_reg->CPUID)
    {
        case cn_revision_r0p0:
            break;    //市场没有版本0的芯片
        case cn_revision_r1p0:
            pg_scb_reg->CCR |= 1<<bo_scb_ccr_stkalign;
            break;
        case cn_revision_r1p1:
            pg_scb_reg->CCR |= 1<<bo_scb_ccr_stkalign;
            break;
        case cn_revision_r2p0:break;    //好像没什么要做的
    }

    pg_inflash_fpec_reg->ACR &= ~(u32)0x1f;
    pg_inflash_fpec_reg->ACR |= (CN_CFG_MCLK-1)/24000000;   //设置等待周期。
    pg_inflash_fpec_reg->ACR |= 0x10;       //开启预取


    if(((pg_rcc_reg->CR & cn_cr_check_mask) != cn_cr_check)
                || ((pg_rcc_reg->CFGR & cn_cfgr_check_mask) != cn_cfgr_check))
    {
        //开始初始化时钟
        //step1:复位时钟控制寄存器
        pg_rcc_reg->CR |= (uint32_t)0x00000001;
        // 复位 SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], ADCPRE[1:0] MCO[2:0] 位
        pg_rcc_reg->CFGR &= (uint32_t)0xF8FF0000;
        // 复位 HSEON, CSSON and PLLON 位
        pg_rcc_reg->CR &= (uint32_t)0xFEF6FFFF;
        // 复位 HSEBYP 位
        pg_rcc_reg->CR &= (uint32_t)0xFFFBFFFF;
        // 复位 PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE 位
        pg_rcc_reg->CFGR &= (uint32_t)0xFF80FFFF;
        // 禁止所有中断
        pg_rcc_reg->CIR = 0x00000000;

        //step2:设置各时钟控制位以及倍频、分频值
        pg_rcc_reg->CFGR = cn_cfgr_set+(7<<24);   // set clock configuration register
        pg_rcc_reg->CR   = cn_cr_set;     // set clock control register

        while(bb_rcc_cr_hserdy ==0);
        while(bb_rcc_cr_pllrdy ==0);
    }
    SRAM_Init();

    Load_Preload();
}
コード例 #29
0
void send_keyboard(report_keyboard_t *report)
{
    uint32_t irqflags;

#ifdef NKRO_ENABLE
    if (!keymap_config.nkro)
    {
#endif //NKRO_ENABLE
        while (udi_hid_kbd_b_report_trans_ongoing) { main_subtasks(); } //Run other tasks while waiting for USB to be free

        irqflags = __get_PRIMASK();
        __disable_irq();
        __DMB();

        memcpy(udi_hid_kbd_report, report->raw, UDI_HID_KBD_REPORT_SIZE);
        udi_hid_kbd_b_report_valid = 1;
        udi_hid_kbd_send_report();

        __DMB();
        __set_PRIMASK(irqflags);
#ifdef NKRO_ENABLE
    }
    else
    {
        while (udi_hid_nkro_b_report_trans_ongoing) { main_subtasks(); } //Run other tasks while waiting for USB to be free

        irqflags = __get_PRIMASK();
        __disable_irq();
        __DMB();

        memcpy(udi_hid_nkro_report, report->raw, UDI_HID_NKRO_REPORT_SIZE);
        udi_hid_nkro_b_report_valid = 1;
        udi_hid_nkro_send_report();

        __DMB();
        __set_PRIMASK(irqflags);
    }
#endif //NKRO_ENABLE
}
コード例 #30
0
/**
 * \brief Schedules an rtimer task to be triggered at time t
 * \param t The time when the task will need executed. This is an absolute
 *          time, in other words the task will be executed AT time \e t,
 *          not IN \e t ticks
 */
void
rtimer_arch_schedule(rtimer_clock_t t)
{
  rtimer_clock_t now;
  uint32_t primask = __get_PRIMASK();

  __set_PRIMASK(1);

  now = RTIMER_NOW();

  /*
   * New value must be a few ticks in the future.
   */
  if((int32_t)(t - now) < 20) {
    t = now + 20;
  }

  LPC_RITIMER->COMPVAL = t;

   __set_PRIMASK(primask);

  NVIC_EnableIRQ(RIT_IRQn);
}